v0.15.0
Embeddings are opt-in. Full-text search (BM25) is now the default arm everywhere, and a fresh install no longer downloads a 466 MB embedding model or embeds anything at sync - first import of an 11k-session corpus dropped from 113m56s to 39m22s (2.89x) in the release A/B against a real S3 store. A 63-day usage-trace evaluation (1,126 real searches, docs/researches/) found fts matches or beats vector quality on this workload, which is why the default flipped rather than just the cost.
Upgrading: if you used semantic search and want to keep it, set [embeddings].enabled = true in config (or POND_EMBEDDINGS_ENABLED=1; boolean-ish 1/0/yes/no/true/false all parse). Without it, searches run fts - degraded for meaning-style queries, never broken, and your existing embeddings and semantic index stay untouched on the store for the moment you opt back in. Then re-run pond init - it now detects your existing sync schedule and offers to re-register it, refreshing the unit after the upgrade (or run pond schedule start).
🛠 Breaking Changes
- search: fts is the default arm; embeddings opt-in via
[embeddings].enabled(a5b2779)- An omitted
modenow resolves toftson every surface: CLI (pond search), MCP (pond_search), HTTP wire, and the openclaw/pi/hermes plugins.mode=vectoron a disabled instance returns a typed refusal namingembeddings.enabled(retryable: false) instead of failing obscurely; the HTTPmin_scoreparameter of an old client is silently ignored, not rejected. - Disabled instances skip the model download, the embed stage, and the vector index intent entirely; the MCP tool surface describes itself fts-only so agents are never routed to a refusal. Enabled instances behave exactly as before - the release A/B measured parity on every enabled-path read.
- Reads got cheaper on the new default:
pond status -v79.1s -> 21.6s (3.67x) on the real 2.87M-message S3 store (embedding scans replaced by index-resident reads),status1.18x,search --mode ftsat parity (1.04 +/- 0.16). Baselines indocs/benchmarks/results.md.
- An omitted
- status: report embeddings_enabled in status --format json (afbdd8e)
- Additive field so a consumer can tell which arm an omitted
moderesolves to without reading config. (This commit also carries the release's breaking marker: the squash subject above used the malformedfeat!(scope):form the conventional-commit parser ignores.)
- Additive field so a consumer can tell which arm an omitted
🎉 New Features
- init: schedule repair - re-running
pond initdetects an active sync schedule and offers to re-register it, rewriting the unit with the current template (config-file pin, absolutized paths). The prompt defaults to yes with the current cadence preselected; declining leaves the unit byte-identical. Interactive only, so sandboxed--yesruns can never repoint a real unit. (a5b2779) - plugins: openclaw-pond 0.2.0 and pi-pond 0.3.0 ship the version-neutral fts-default tool descriptions and now auto-publish to npm via trusted publishing (OIDC, no tokens) on each release. (a5b2779)
📚 Documentation
- site: add /compare page; link it from the README FAQ table (e91fcec)
- readme: add side-by-side table under the memory-tool FAQ (e52a49d)
- readme: add the roadmap - shipped steps, what is next in order, and what is not planned (d47ec3c)
Full Changelog: v0.14.11...v0.15.0