v3.21.1

ruvnet/ruflov3.21.1Jul 4, 2026by ruvnet

AI Summary

Fixes two external-reported regressions: broken memory search recall and npx init leaving self-learning as a no-op.

Key Highlights

  • Fixed 'memory search' keyword recall and BM25 fusion
  • Fixed 'npx ruflo init' to properly resolve memory package path
  • Added sidecar file for memory package path resolution
  • WAL checkpointing now ensures readers see updates

New Features

  • Memory search recall fix
  • Init hook resolution fix

Full Release Notes

Two external-reported regression fixes.

## Fixed
- **#2558 — `memory search` broken** (keyword recall random, HNSW index 0 vectors). Two defects: the Phase-2 BM25 fusion silently dropped the keyword-coverage floor (IDF collapses on small corpora → docs containing the query word scored below threshold), and WAL-mode writes were never checkpointed so WAL-blind readers saw 0 vectors. Fix: coverage floor + recall-friendly fusion + `wal_checkpoint` on store + accurate `total_vectors`. Search now recalls confirmed-stored entries (targeted, not a dump). 169/169 memory suite.
- **#2545 — `npx ruflo init` left self-learning a silent no-op.** `@claude-flow/memory` (optionalDependency) lands in the npx cache, off the project's node_modules walk-up, so the auto-memory hook never resolved it. Fix: init records the resolved path in a `.claude-flow/memory-package.json` sidecar; hook reads it first and now fails LOUD when memory is genuinely absent; `doctor --fix` repairs it.

PRs: #2567, #2564