What's Changed
- fix(cli): stop stranding anyio worker threads on command exit by @phernandez in #1349
- fix(core): ignore wikilinks in inline code by @phernandez in #1348
- fix(core): honor batch metadata concurrency by @phernandez in #1347
- docs(core): explain CLA acceptance, sign-off fixes, and fork PR CI by @phernandez in #1350
- fix(integrations): declare the Hermes plugin manifest as v1 so the installer accepts it by @phernandez in #1356
- fix(cli): stop accepting a private project visibility the cloud does not have by @phernandez in #1357
- fix(installer): pass --prerelease=allow on every uv install path by @phernandez in #1353
- fix(cli): drop the local routing entry when a cloud project is removed by @phernandez in #1355
- fix(core): unresolve inbound relations on entity delete by @phernandez in #1358
- fix(cli): seed config projects into the database on CLI-only installs by @phernandez in #1354
- docs(core): drop the broken star-history chart and document CJK keyword-search limits by @phernandez in #1360
- fix(core): make case-only renames stick on case-insensitive filesystems by @phernandez in #1362
- feat(cli): add bm prune to drop index entries for ignored files by @phernandez in #1363
- fix(core): parse quoted PostgreSQL search safely by @phernandez in #1361
- fix(core): refresh linking notes' search rows on API note delete by @phernandez in #1368
- feat(core): configure custom OpenAI embedding endpoints by @phernandez in #1370
- fix(integrations): make the memory write path insistent and its result citable by @phernandez in #1367
- fix(core): stop splitting entity body into per-bullet vector chunks by @phernandez in #1371
- feat(mcp): surface similar existing notes after write_note creates a note by @phernandez in #1375
- fix(core): bound production indexing convergence by @phernandez in #1374
- feat(core): add portable document ingestion contracts by @phernandez in #1178
- feat(core): add the pdf-inspector extraction adapter behind a pdf extra by @phernandez in #1377
- fix(core): tolerate disappearing guarded files by @phernandez in #1383
- feat(core): support unsegmented-script full-text search by @phernandez in #1373
- fix(core): batch relation search refresh cleanup by @phernandez in #1391
- feat(mcp): ship the manual in the package and serve it as resources by @phernandez in #1389
- fix(mcp): correct the search_notes examples in the tool description by @phernandez in #1386
- feat(mcp): generate manual SYNOPSIS blocks from the tool registry by @phernandez in #1393
- test(core): benchmark multilingual embeddings by @phernandez in #1392
- feat(core): add deterministic wiki projector by @phernandez in #1381
- feat(mcp): serve notes as MCP resources via their memory:// URLs by @phernandez in #1394
- feat(core): order accepted project changes by @phernandez in #1382
- feat(mcp): add POSIX read tools behind enable_posix_tools flag by @phernandez in #1406
- feat(core): add section indexing and range reads by @phernandez in #1408
- feat(cli): add POSIX verbs over the shared translation layer by @phernandez in #1411
- feat(core): add BEAM benchmark integration to the benchmarks package by @phernandez in #1407
- feat(core): add agent-task eval harness for tool-surface comparison by @phernandez in #1409
- feat(core): add xAFS dataset adapter to the benchmarks package by @phernandez in #1410
- refactor(core): converge wiki logs on the accepted-change vocabulary by @phernandez in #1396
- feat(cli): add local wiki projection commands by @phernandez in #1422
- fix(ci): pin the uv interpreter so the matrix tests what it claims by @phernandez in #1429
- fix(core): harden the eval harness from live A/B and BEAM runs by @phernandez in #1416
- fix(core): bound generated wiki logs by @phernandez in #1433
- fix(core): link empty wiki folders from parent indexes by @phernandez in #1434
- feat(mcp): route project-qualified paths in the POSIX tools by @phernandez in #1421
- fix(core): keep deleted wiki folders deleted by @phernandez in #1436
- feat(mcp): add metadata predicates and field projection to POSIX find by @phernandez in #1423
- feat(core): add temporal qualifiers and time-aware search (SPEC-82) by @phernandez in #1426
- fix(mcp): route identifiers by the session's own project set by @phernandez in #1439
- fix(core): restrict the vector filter pass to its own candidates by @phernandez in #1443
- fix(core): key search_index uniqueness on the row kind by @phernandez in #1444
- fix(cli): index on project add and make status readiness honest by @phernandez in #1440
- fix(core): merge the alembic heads left by #1440 and #1444 by @phernandez in #1447
- fix(core): seed agent-task projects with one index pass, and verify recency by @phernandez in #1448
- feat(core): record error excerpts on failed agent-task tool turns by @phernandez in #1449
- feat(core): xAFS audit, corrections, judge default, and harness fixes by @phernandez in #1450
- fix(core): record seeding failures against their tasks instead of aborting by @phernandez in #1452
- fix(core): index markdown whose leading fences are not YAML by @phernandez in #1453
- docs(skills): literary analysis corrections from the Moby Dick run by @phernandez in #1459
- feat(core): agent-curated BEAM ingestion by @phernandez in #1461
- feat(core): curate BEAM conversations in parallel by @phernandez in #1462
- fix(core): keep BEAM curation alive through server startup failures, and resume by @phernandez in #1463
- fix(core): surface the HTTP error body in completion-runner failures by @phernandez in #1464
- feat(api): batch accepted note reads for hosted search by @phernandez in #1454
- fix(core): run claude -p judges and answerers without the operator's MCP servers by @phernandez in #1465
- fix(core): sandbox the bm-local provider's default project home by @phernandez in #1467
- feat(core): resume an interrupted BEAM scoring pass by @phernandez in #1469
- fix(mcp): stop a same-named note from being read as its own project by @mmaxjr in #1460
- fix(mcp): preserve search result fidelity by @phernandez in #1470
- feat(integrations): expose OpenClaw note metadata by @phernandez in #1474
- fix(mcp): normalize constrained project names by @phernandez in #1471
- fix(core): support type metadata in edit note by @phernandez in #1472
- fix(cli): honor Claude profile configuration by @phernandez in #1473
- fix(core): make Markdown note permalinks mandatory by @phernandez in #1477
- fix(core): use bounded SQLite pooling on Windows by @phernandez in #1480
- fix(mcp): round-trip find note-type predicates by @phernandez in #1481
- fix(cli): validate local sync path before saving config by @dawNotPoi in #1466
- feat: generate PARAMETERS from the tool registry by @FBISiri in #1478
- test(core): verify semantic reindex exits on native platforms by @phernandez in #1482
- feat(core): let a subclass write inside the accept transaction by @groksrc in #1483
- fix(core): project accepted note filenames using canonical metadata by @phernandez in #1484
- fix(core): preserve non-Markdown files during moves by @phernandez in #1485
- feat(core): enforce one-way locked notes in mutation APIs by @phernandez in #1486
- feat(integrations): give Tau persistent Basic Memory continuity by @phernandez in #1489
- feat(core): add PDF page citations to document observations by @phernandez in #1490
- feat(core): add an overridable seam for completed schema validation by @groksrc in #1491
- feat(integrations): unify Tau memory schemas and setup by @phernandez in #1493
- fix(core): report resolved schema identity to validation observers by @groksrc in #1494
- feat(cli): add Codex plugin install command by @phernandez in #1497
- feat(cli): add Claude Code plugin install command by @phernandez in #1498
- feat(mcp): add bounded line reads and literal grep context by @phernandez in #1502
- feat(integrations): add Pi memory package by @phernandez in #1492
- fix(core): preserve agent source through note materialization by @phernandez in #1505
- fix(plugins): upgrade FastMCP to stable 4.0.3 by @phernandez in #1506
- feat(mcp): enable POSIX tools by default by @phernandez in #1507
- fix(cli): report missing notes with a failing exit status by @phernandez in #1508
- fix(integrations): report effective Pi automation status by @phernandez in #1509
- perf(core): avoid hashing files before the first index by @phernandez in #1510
- docs(plugins): diagnose Codex Desktop WSL hook prerequisites by @phernandez in #1511
- fix(mcp): retry gateway rate limits by @dawNotPoi in #1513
- feat(core): index Markdown links to project files by @phernandez in #1514
- feat(mcp): add compact search discovery results by @phernandez in #1515
- feat(mcp): add compact graph context discovery by @phernandez in #1516
- feat(cli): expose compact search and context discovery by @phernandez in #1518
- feat(core): retain extraction page maps in document provenance by @phernandez in #1519
- docs(core): publish document extraction schema note by @phernandez in #1517
- fix(mcp): unify note writes with typed outcomes by @phernandez in #1521
- fix(cli): wait out rate limits during a WebDAV transfer by @phernandez in #1532
- feat(core): ingest docx, pptx, and csv into document sidecar notes by @phernandez in #1529
- feat(cli): generate section-1 man SYNOPSIS and OPTIONS from Typer by @FBISiri in #1524
- fix(core): honor escaped hashes and whitespace in ignore patterns by @phernandez in #1544
- fix(mcp): report index-required guidance for never-indexed projects by @phernandez in #1545
- fix(sync): repair Markdown type drift while preserving resource convergence by @phernandez in #1543
- fix(core): exclude Emacs autosaves from local indexing by @phernandez in #1547
- fix(core): reject missing replace_section headings by @phernandez in #1546
- fix(mcp): explain empty unspaced CJK compound searches by @phernandez in #1548
- perf(core): bound lexical hybrid previews and trace search stages by @phernandez in #1556
- perf(core): bound reranker batches and disable ONNX CPU arena by @phernandez in #1555
- refactor(core): compile search filters over an explicit ProjectScope by @phernandez in #1562
- refactor(core): move FTS execution behind FtsBackend and bind the read path to scope by @phernandez in #1563
- refactor(core): extract SearchReader and SemanticSearch from the search repository by @phernandez in #1565
- refactor(core): bind vector adapters to the database and search them over a ProjectScope by @phernandez in #1566
- feat(api): search an explicit set of projects with one query by @phernandez in #1567
- feat(mcp): search all projects with one scoped query per database by @phernandez in #1573
- perf(core): read only the projects in scope from the vector indexes by @phernandez in #1574
- fix(core): fill a filtered vector window instead of stopping at rejected neighbours by @phernandez in #1575
- fix(mcp): rank merged search hits by strength and name each hit's project by @phernandez in #1576
- fix(core): resolve Markdown path links against the note at resolution time by @phernandez in #1577
- fix(core): keep projects under a shared root top-level by @phernandez in #1598
- feat(cli): always delete cloud files on cloud project remove by @phernandez in #1600
- fix(core): let Wiki index.md links become graph relations by @phernandez in #1601
- perf(core): cut Logfire span and log volume on hot paths by @phernandez in #1602
- fix(core): let storage own the note-file delete checksum match by @jope-bm in #1606
- feat(core): stamp created_by/updated_by authorship in note frontmatter by @phernandez in #1608
- docs(core): align importer Args: names with actual function signatures by @phernandez in #1610
- docs(skills): note optional web search setup for memory-research by @phernandez in #1611
- fix(core): avoid correlated sqlite-vec orphan cleanup by @phernandez in #1612
- fix(mcp): report a missing explicit note path as not found by @phernandez in #1614
- chore(mcp): audit model-facing prompts, tool descriptions, and skills by @phernandez in #1603
- feat(cli): export and validate OKF v0.2 bundles by @phernandez in #1554
- fix(mcp): apply move_note cross-project guard to directory moves by @phernandez in #1615
- fix(core): retrieve once per reranked search request by @phernandez in #1616
- docs(core): v0.24.0 changelog by @phernandez in #1618
- fix(core): keep agent actor origins when parsing object metadata by @phernandez in #1613
- docs: describe what man1/ actually ships by @phernandez in #1620
- fix(mcp): report the accepted checksum from write_note and edit_note by @phernandez in #1619
- fix(core): replace an entity's search rows in one transaction by @phernandez in #1623
- fix(core): resolve explicit non-slug permalinks through memory:// URLs by @phernandez in #1622
- fix(core): v0.24.0 live-run defects (project lookup, build_context, wiki, man, search scope, examples) by @phernandez in #1637
- docs(core): v0.24.0 changelog entries for #1586 and #1613 by @phernandez in #1639
- feat(core): record the actor on note deletes by @phernandez in #1640
- fix(mcp): report failed delete_note and move_note as tool errors by @phernandez in #1641
- feat(mcp): let write_note overwrite only the revision the caller read by @jope-bm in #1642
- fix: project status over GET, and say why workspace discovery failed by @phernandez in #1643
- fix(core): a project with indexed notes is indexed, even without a full pass by @phernandez in #1645
- fix(core): recognize a synced original that indexing already rewrote by @phernandez in #1654
- fix(core): index single files with the checksum storage reports by @phernandez in #1655
- fix(core): create vector storage at initialization, never at runtime by @phernandez in #1656
- feat(core): name new Alembic revisions by sequential schema version by @phernandez in #1658
- fix(core): serialize vector storage DDL so concurrent initializations cannot race by @phernandez in #1659
- fix(core): compare storage and content checksums like with like; record the materialized object's storage checksum by @phernandez in #1660
- fix(core): accept-time publication marker; PUT renames announce moves; real-DB runner tests by @phernandez in #1668
- ci: balance Postgres shards by recorded durations; run Windows only on main by @phernandez in #1669
- fix(core): move a directory's notes as accepted note moves by @phernandez in #1670
- fix(core): recognize a DB-first note's storage echo by its accepted content by @phernandez in #1671
- feat(core): report work units on indexing and embedding results by @phernandez in #1672
- fix: Carry the content checksum on index-file results for live updates by @phernandez in #1673
- fix(mcp): edit_note reports a refused write as an error by @sammywachtel in #1662
- fix(mcp): revert edit_note refused-write error reporting (#1662) by @phernandez in #1682
- test(core): write the indexed-bytes test note with LF newlines by @phernandez in #1678
- fix(mcp): fixes from the v0.24.0 live test by @phernandez in #1683
- fix(core): log tracebacks without per-frame values on the long-lived sinks by @phernandez in #1679
- docs(core): bring the v0.24.0 changelog up to date by @phernandez in #1680
- test(cli): make the man install default-root test own its HOME by @phernandez in #1690
- fix(mcp): make grep match keywords by default by @phernandez in #1689
- fix(core): key vector chunks by content so unchanged text keeps its embedding by @phernandez in #1691
- docs(core): align delete_directory and find docstring Args with signatures by @FBISiri in #1652
- fix(core): a search refresh that loses a race never fails the save by @phernandez in #1694
- fix(core): an accepted write is never reported as failed by its file write by @phernandez in #1693
- fix(mcp): widen metadata filter grammar and own the count query by @phernandez in #1676
- fix(core): warn when the watcher cannot read a new directory by @phernandez in #1692
- fix(sync): make the index delete check case-exact by @phernandez in #1699
- fix(cli): bind MCP HTTP transports to loopback by default by @phernandez in #1697
- fix(core): keep environment overrides out of config.json by @phernandez in #1701
- feat(mcp): let compact build_context skip loading observations by @phernandez in #1702
- fix(core): resume deferred oversized-entity embeddings on the next index pass by @phernandez in #1700
- fix(core): quote punctuated words one by one in SQLite full-text queries by @phernandez in #1695
- fix(cli): polish help and messages from the v0.24.0 live run by @phernandez in #1704
- fix(mcp): fix small note-tool defects from the v0.24.0 live run by @phernandez in #1705
- fix(core): keep appended setext underlines from turning paragraphs into headings by @phernandez in #1698
- docs(core): add the v0.24.0 milestone fixes to the changelog by @phernandez in #1706
- feat(core): remove semantic_search_enabled; semantic search is always on by @phernandez in #1696
- fix(core): finish removing semantic_search_enabled after today's merges by @phernandez in #1709
- docs(core): add the #1696 semantic-search-always-on entry to the changelog by @phernandez in #1707
- fix(cli): describe all edit_note operations in help and docstring by @phernandez in #1710
- fix(cli): list Team projects in one request and transfer files in parallel by @phernandez in #1703
- perf(sync): skip embeddings for Wiki projector pages by @phernandez in #1714
- feat(cli): deprecate cloud bisync and mirror sync; diagnostics env overrides by @phernandez in #1711
- feat(mcp): checksum-guarded edit_note and metadata-only read_note by @phernandez in #1712
- fix(cli): escape user values in Rich output; single deprecation notice by @phernandez in #1723
- feat(core): extracted_text sidecars, page map on the run note, stored file formats by @phernandez in #1724
- fix(core): keep created_at on edits; clearer build_context and conflict output by @phernandez in #1725
- fix(mcp): give the similar-notes advisory its own similarity floor by @phernandez in #1722
- docs(skills): add memory-comark for ::bm-* components in notes by @phernandez in #1715
- fix(core): drain deferred embeddings in reindex and report unfinished work by @phernandez in #1729
- fix(core): embed accepted writes once, after the file is materialized by @phernandez in #1735
- docs: add comark(7), the Comark component quick reference by @phernandez in #1736
- docs: say component problems never block a write by @phernandez in #1739
- feat(core): connect extracted text to source files with derived_from by @phernandez in #1744
- fix(mcp): fixes from the v0.24.0 live run by @phernandez in #1745
- docs(core): fill remaining v0.24.0 changelog gaps by @phernandez in #1749
- docs(skills): describe Comark authoring recovery and repairs by @phernandez in #1754
- perf(core): stop runaway vector widening and cap note text in search reads by @phernandez in #1750
- perf(core): rank only filter-admitted chunks inside sqlite-vec and pgvector by @phernandez in #1753
- perf(core): rank search by id and fetch note text for returned rows only by @phernandez in #1755
- fix(core): read rerank prefix text up to the reranker's document limit by @phernandez in #1757
- fix(core): widen rerank reads only for rows without a matched chunk by @phernandez in #1758
- perf(core): per-note read-cache eviction groups on fastapi-redis-sdk, QUERY-only search and resolve by @phernandez in #1752
- feat(skills): add memory-quest skill for Memory Quest Mission 8 by @groksrc in #1677
- ci(skills): publish every skill as a downloadable zip by @groksrc in #1737
- fix(integrations): pass Memory Quest fields through OpenClaw and Hermes tools by @groksrc in #1738
- fix(core): indexing and vector sync fixes from contributor reports by @phernandez in #1759
- chore(deps): update fastmcp to 4.1.0 by @phernandez in #1760
- fix(core): stop recording read cache hits as span errors by @phernandez in #1761
- fix(core): delete retired read-cache entries on invalidation by @phernandez in #1762
- fix(integrations): mask credentials on the hermes capture path by @k0nnect in #1764
- fix(core): normalize file paths to NFC at the ingest boundary on macOS by @phernandez in #1766
- feat(skills): project-note reflect and defrag, temporal qualifiers, memory-okf, packaged skills by @phernandez in #1767
- fix(api): delete omitted frontmatter keys on a full-document PUT by @phernandez in #1769
- docs(core): add a dev-mode .envrc that isolates Basic Memory config by @groksrc in #1779
- fix(core): preserve file created_at through index input adaptation by @phernandez in #1781
- fix(mcp): create missing edit_note notes at the path the identifier names by @phernandez in #1782
- fix(mcp): name other-workspace projects in POSIX refusals and ls / by @phernandez in #1780
- fix(mcp): skip generated notes in write_note's similar-notes advisory by @phernandez in #1784
- feat(skills): add memory-agents for Basic Memory Cloud agents by @phernandez in #1785
- fix(sync): move reused vector chunk metadata in set-based batches by @phernandez in #1788
- fix(core): report case-only Wiki scope collisions instead of failing the run by @phernandez in #1789
- fix(cli): import ChatGPT conversations that have no title by @phernandez in #1790
- perf(core): count admitted vector chunks from the manifest alone by @phernandez in #1793
- perf(core): run FTS text conditions only on the GIN candidates by @phernandez in #1794
- perf(core): read FTS chunk candidates from the GIN index by @phernandez in #1795
- fix(core): avoid reflecting vector tables during NFC migration by @phernandez in #1801
- perf(core): collect multiword FTS operand matches through GIN by @phernandez in #1802
- fix(api): bound context traversal depth and recent page size by @phernandez in #1804
- fix(deps): update security dependencies and container trust stores by @phernandez in #1805
- fix(core): keep remote paths independent of host symlinks by @phernandez in #1807
- docs(core): update v0.24.0 changelog for release by @phernandez in #1818
- fix(ci): pin Codex hook ref without resolving the unpushed release tag by @phernandez in #1819
- chore(core): release v0.24.0 by @phernandez in #1821
New Contributors
- @mmaxjr made their first contribution in #1460
- @dawNotPoi made their first contribution in #1466
- @FBISiri made their first contribution in #1478
- @sammywachtel made their first contribution in #1662
- @k0nnect made their first contribution in #1764
Full Changelog: v0.23.2...v0.24.0