v0.12.0
Onboarding and multi-machine sync: a first run no longer looks like it hangs, the scheduled sync no longer races a manual one, and pond status finally reports this host's own relationship to the store. Verified end to end on a fresh install (macOS and Linux) plus cold-context first-run testing.
🛠 Breaking Changes
pond status --format jsonoutput shape changed - theadaptersfield is renamed tosource_agents(count of distinct source agents in the store), andschedulechanges from a string to an object{active, backend, every}. A new top-levelpond_versionfield carries the producing binary's version so consumers can pin the format going forward. Scripts parsing status JSON must update these keys. (5e56aad)
🎉 New Features
- sync: per-host single-flight lock (a local flock in the state dir, never on the Lance store - cross-host writers stay pure OCC); a second sync waits and names the holder,
--no-waitskips cleanly (exit 0) and is what the scheduled job passes so ticks never queue. Adds--dry-run(per-adapter freshness preview, writes nothing) and--format json(one summary document on stdout for every outcome, progress on stderr). Every long phase now has a live face - rowmap-build spinner, model-download stage line, per-adapter bar with a recent-rate ETA, inline-embed counter - plus a ~30s heartbeat off-TTY.pond statusgains a local section (per-adapter sources + pending-sync counts, last sync outcome incl. a surfaced scheduled failure, next scheduled run) and--hostsfleet view;pond initruns the first sync in the foreground and registers the schedule only after it completes, so a fresh timer never races it. (26a7c7a) - nix: canonical flake shipped in-repo; releases are the single binary host (a4f5e09)
🐛 Bug Fixes
- cli: first-run onboarding polish - the ~500 MB embedding-model download now announces itself before it starts (previously a silent multi-minute "hang");
pond statusno longer fuses long adapter names with their counts and reads "semantic ready (brute-force; index builds at scale)" instead of the alarming "below activation threshold"; empty-store search points atpond initrather than blaming filters that were never set; no-adapters states namepond adapters discover; message deltas are labelled "searchable" so the searchable-vs-total gap stops reading as data loss. (43d53f5) - cli:
pond status --format jsonemits a JSON error document on the store-open failure path instead of empty stdout (matchingsync --format json); vector search reads "N nearest messages" with a--mode ftscaveat so a gibberish query no longer looks like confident relevance; andpond sql/pond search/pond geterror text renders CLI verbs instead of the shared module's MCP tool/resource names. (9423535)
🚜 Refactor
- sync: address PR review findings - close the Ctrl-C window in
initschedule registration, reject un-embeddableXDG_STATE_HOMEpaths, and DRY the shared status/heartbeat helpers (29a4b3a)
Full Changelog: v0.11.2...v0.12.0