v2.4.0 — Detection rules as memory, MCP Registry, SQLite hardening
Detection-rules-as-memory, MCP Registry publication, SQLite concurrency hardening, test-suite hygiene, and brand/docs polish.
Added
- Sigma + YARA as first-class memory entities with LLM rule explainer (#70)
- Detection Rules as Memory README section (#74)
- MCP Registry publication infra — `server.json` and PyPI `mcp-name` tag so ZettelForge can be published to registry.modelcontextprotocol.io (#75)
- Brand & docs polish — neural-chain architecture diagram with light/dark parity, canonical security channels + RFC 9116 `security.txt`, refreshed GitHub social preview (#61)
Fixed
- SQLite reader concurrency — 16 reader methods now hold `_write_lock`, closing a production read-during-write race that could surface as `pydantic.ValidationError` on NULL columns during concurrent enrichment (closes #68, #69)
- 3 CI test regressions stabilized (#67)
Changed
- Test suite hygiene — 280 → 305 passing, 17 → 10 skipped, 2 → 0 xfailed on 3.12. Migrated `langchain_retriever` to Pydantic V2 ConfigDict. Converted 10 CI-skipped LLM tests to the mock provider (RFC-002 Phase 1) (#62, #63, #64, #65)
Install
```bash
pip install --upgrade zettelforge
```
Full changelog: https://github.com/rolandpg/zettelforge/blob/master/CHANGELOG.md