What's Changed
- docs: surface sponsors near the top of the README, fix the blog scaffold by @AxDSan in #590
- docs(readme): give the sponsor block real presence by @AxDSan in #591
- governance: add CODEOWNERS and MAINTAINERS.md by @AxDSan in #597
- docs(hermes): clarify Docker multi-profile wrappers by @dplush in #609
- fix(hermes): preserve wrapper installs safely by @dplush in #610
- fix(model-refresh): degrade malformed confidence instead of raising or outranking by @Milgauss in #574
- fix: widen sqlite-vec candidates before working-memory filters by @pvspencer22 in #608
- Fix malformed tables by @SaSteMi in #569
- fix(benchmarks): carry the #544 version regex fix to the benchmark copy by @fesalfayed in #596
- docs(persona): clarify tier ordering and retention semantics by @Milgauss in #612
- feat(diagnostics): report resolved embedding dimension in doctor by @paoloantinori in #567
- fix(hermes): report memory_not_found when invalidate matches no row by @Sanjays2402 in #542
- fix: code audit F-rule cleanup (10 files, 73 lines) by @ether-btc in #483
- fix: add register() bridge so Hermes memory provider discovery finds MnemosyneMemoryProvider by @oscarello in #565
- ci: widen Ruff baseline to F/RUF022, scoped to PR changed-files by @ether-btc in #568
- fix(hermes): align packaged manifest version by @dplush in #588
- fix: honor dry run for file imports by @dplush in #540
- fix(config): resolve recall weights at runtime by @dplush in #572
- fix(config): resolve degrade batch at runtime by @dplush in #626
- fix(persona): retain small sections under token cap by @dplush in #627
- docs: complete unreleased release notes by @dplush in #628
- fix(beam): fail loudly on incomplete vector rebuilds by @dplush in #603
- docs: add changelog entry for #603 by @dplush in #629
- fix(hermes): reject mismatched wrapper Python runtimes by @dplush in #630
- docs(hermes): explain wrapper Python compatibility by @dplush in #632
- docs(recall): clarify runtime weight precedence by @dplush in #633
- docs(cli): explain rebuild repair exit codes by @dplush in #634
- docs(hermes): explain direct import dry run by @dplush in #636
- test(beam): cover successful vector reindex mapping by @dplush in #637
- fix(beam): invalidate persisted cache after remember by @dplush in #566
- feat(cli): report core and Hermes versions by @dplush in #643
- fix(hygiene): unwrap audit envelope before cleaning candidates by @Awshesh12 in #619
- test(hermes): cover invalidate audit metadata by @dplush in #638
- fix(embeddings): fail loud on unknown embedding model by @paoloantinori in #521
- feat(recall): add MNEMOSYNE_LEXICAL_GATE_MIN knob to override the lexical admission gate by @hofstatter in #639
- docs(configuration): document the lexical recall gate + measured recall-flag data by @kenichi-shibata in #622
- chore(hermes): prepare 0.6.0 standalone release by @dplush in #667
- fix: record recall diagnostics on the polyphonic recall path by @cgray2222 in #668
- fix(mcp): report failed invalidations accurately by @dplush in #675
- test(mcp): cover hygiene cleanup with legacy importance by @dplush in #673
- fix: recognize bge-m3 embedding alias by @dplush in #674
- fix: validate invalidation replacements by @dplush in #678
- fix: replace bare except with logger.warning in legacy provider register() by @ether-btc in #650
- fix(hermes-provider): advertise shared_* tools in plugin.yaml manifest by @ether-btc in #648
- fix(hermes): follow wrapper-script exec target when locating Hermes Python by @Awshesh12 in #620
- fix: harden Hermes automatic prefetch relevance by @pvspencer22 in #616
- test(repair): avoid brittle process fd count assertion by @mikemikimike in #614
- fix(hermes): rebind memory on session switch by @mikemikimike in #604
- fix(beam): invalidate cache after forgetting memory by @dplush in #593
- fix(hermes): support root-only plugin installs by @topbronson in #592
- feat(llm): add MiniMax provider preset (regional endpoints + model config) by @octo-patch in #575
- Update feature comparisons in README.md by @gustavami in #534
- test(mcp): cover SSE messages mount lifecycle by @aaka3207 in #652
- fix(cli): normalize MSYS backup destinations by @dplush in #683
- docs: document Hermes integration test setup by @dplush in #684
- fix(hermes): validate the discovered interpreter and honor --python (follow-up to #620) by @tonythomson in #623
- docs: add embedding model reindex runbook by @dplush in #698
- fix(beam): preserve degradation savepoint during vec refresh by @dplush in #694
- docs: clarify LLM consolidation configuration by @dplush in #686
- fix: warn before uncached local model download by @dplush in #704
- fix(hermes): export the resolved memory bank by @dplush in #702
- feat(llm): allow relocating the local model cache by @tonythomson in #713
- fix(mcp): expose canonical retirement tool by @dplush in #723
- fix(hermes): honor tool allowlist during discovery by @dplush in #725
- test(hermes): cover no-yaml allowlist parity by @dplush in #731
- fix: fail closed on truncated reasoning traces by @dplush in #734
- docs: add release note for truncated reasoning fix by @dplush in #737
- fix: log final API embedding failures by @dplush in #738
- docs: add release notes for MCP and Hermes fixes by @dplush in #740
- docs: correct FastEmbed E5 model examples by @dplush in #746
- fix(mcp): handle non-ASCII bearer tokens safely by @ddddddddwp in #743
- fix: status reports interpreter mismatch instead of version mismatch (#736) by @ddddddddwp in #751
- fix: preserve caller transactions in memory batches by @dplush in #760
- fix: keep direct wrapper stores atomic by @dplush in #764
- fix(shmr): pass list to embeddings.embed, drop non-existent facts.status filter (#762) by @ddddddddwp in #765
- fix(mcp): advertise only tools with dispatch handlers (#728) by @ddddddddwp in #758
- fix(hermes): use the shared environment check in the provider diagnostic by @tonythomson in #711
- fix(core): normalize valid_until writes and comparisons to aware UTC (#525) by @ddddddddwp in #759
- fix(packaging): exclude Hermes sources from Core wheel by @ddddddddwp in #730
- fix: split leading-hyphen fragments into FTS-safe recall terms (#744) by @ddddddddwp in #750
- fix(core): bound SQLite FD retention under connection churn by @israellot in #747
- fix(hermes): scope auto-sleep to triggering session; honor auto_sleep_enabled (#771) by @ddddddddwp in #772
- fix(beam): exclude dialog sources from working-memory vec pool (#696) by @Goonik in #705
- fix(beam): cascade gists on forget by @dplush in #786
- chore(release): correct the pending version to 4.0.0 and add the migration guide by @AxDSan in #775
- docs(rfc): correct seven errors in the multimodal RFCs and de-vendor the seam by @AxDSan in #776
- feat(media): media asset registry and moment index (RFC 0003 phase 0) by @AxDSan in #777
- feat(core): give the blob store a reader via ContentResolver and BlobResolver by @AxDSan in #778
- feat(beam): let remember() take an explicit memory_type and opt out of dedupe by @AxDSan in #779
- feat(modality): vendor-neutral provider seam for describing non-text content by @AxDSan in #780
- feat(media): remember_media(), reference to recall by @AxDSan in #781
- docs: sweep the CHANGELOG against v3.15.1..HEAD and write the 4.0.0 upgrade guide by @AxDSan in #792
- feat(release): support PEP 440 pre-release tags so a major can have a beta by @AxDSan in #794
- docs(releasing): make RELEASING.md the whole pipeline, and fix two wrong claims by @AxDSan in #791
- chore(hermes): bump the standalone plugin to 0.7.0 and stop pinning the version in tests by @AxDSan in #795
- feat(release): make release.py understand pre-releases, and stop blaming this repo for sibling drift by @AxDSan in #796
- chore(release): bump the pending version to 4.0.0b1 for the beta cycle by @AxDSan in #799
- test: make modality stub response order deterministic (#798) by @ddddddddwp in #801
- fix(hermes): retain host backend while a primary provider remains active by @dplush in #802
- fix: preserve committed mutations when cache invalidation fails by @dplush in #803
- fix(hermes): make wrapper validation timeout configurable by @dplush in #805
- fix(hermes): explain Windows symlink privilege recovery by @dplush in #808
- fix(hermes): discover native Windows venv Python by @dplush in #811
- docs: add native Windows Hermes recovery guide by @dplush in #812
- fix: detect CJK-labelled secrets across all handling surfaces by @ddddddddwp in #810
- fix(cli): emit static error codes at failure boundaries by @bayhnf in #814
- docs(changelog): order the 3.12.x sections descending, drop a stale artifact by @AxDSan in #824
- fix(build): exclude examples/ from Core wheel package discovery by @AxDSan in #823
- test(beam): stop the valid_until fixture failing for two hours every day by @AxDSan in #825
- fix(export): disclose partial portable JSON surfaces by @dplush in #822
- fix(shmr): keep non-dense imports usable without NumPy by @bayhnf in #839
- fix(modality): honor known HTTP statuses for retry decisions by @dplush in #844
- feat: add native MCP Streamable HTTP transport by @donbowman in #749
- docs(releasing): define how a beta cycle ends by @AxDSan in #826
- docs(skill): stop publishing deployment topology and named routing rules by @AxDSan in #845
- fix(release): the pre-push tag comparison must allow equality by @AxDSan in #800
New Contributors
- @SaSteMi made their first contribution in #569
- @fesalfayed made their first contribution in #596
- @Sanjays2402 made their first contribution in #542
- @oscarello made their first contribution in #565
- @Awshesh12 made their first contribution in #619
- @hofstatter made their first contribution in #639
- @kenichi-shibata made their first contribution in #622
- @cgray2222 made their first contribution in #668
- @mikemikimike made their first contribution in #614
- @topbronson made their first contribution in #592
- @octo-patch made their first contribution in #575
- @gustavami made their first contribution in #534
- @aaka3207 made their first contribution in #652
- @tonythomson made their first contribution in #623
- @ddddddddwp made their first contribution in #743
- @israellot made their first contribution in #747
- @Goonik made their first contribution in #705
- @bayhnf made their first contribution in #814
- @donbowman made their first contribution in #749
Full Changelog: v3.15.1...v4.0.0b1