A hardening release. No new product features — the v0.2.0 feature set becomes safer to run in production. Every change is backward compatible; new configuration is opt-in and off by default.
Highlights
- Structured logging — SmartMemo now logs under the
smartmemologger namespace and is silent by default (it attaches only aNullHandler). Applications opt in by configuring that logger. - SQLite concurrency safety — the store opens in WAL mode with a 5-second busy timeout, and writes are serialized by an internal re-entrant lock so one store instance is safe to use from multiple threads of a process. The guarantees are documented honestly: it is not a distributed cache.
- Bug fix: cascade deletes —
PRAGMA foreign_keysis now enabled, so the schema's declaredON DELETE CASCADEforeign keys actually fire. Deleting or evicting a cache entry previously left orphanlookup_recordsandfeedback_eventsrows behind. async withsupport —async with SmartMemo(...) as cache:guarantees cleanup;close()is unchanged.- Opt-in LLM-call retries —
CacheConfig(retry=RetryConfig(...))retries transientllm_functionfailures with bounded exponential backoff. Off by default; only the cache-miss path is retried. Adds theRetryConfigmodel and theLLMCallErrorexception. - CI & release safety — CI now tests Python 3.11–3.14, and the PyPI publish workflow runs the full test suite before building and releasing.
- Adds
CONTRIBUTING.mdand tests for every new behavior (88 tests total).
See CHANGELOG.md for details.
🤖 Generated with Claude Code