Persistence:
- one delivery state per sink, with claim, crash recovery, and index replacement
- retention for delivered and dead records
- LMDB writes moved off the event loop
Pipeline:
- one attempt per dispatch, with the next try scheduled by next_retry_at
- backpressure through max_queue_size
- reload re-reads YAML; SIGTERM drains and SIGHUP reloads
Plugins:
- journald source, enricher and filter processors, Loki sink
- built-ins register when entry points are missing
API and CLI:
- health, metrics, per-sink queue, and dead-letter replay
- startup prints the pipeline on one line
Tests:
- dispatch, plugins, metrics, CLI, and persistence coverage
Set up the daena project with:
- pyproject.toml with all core and dev dependencies
- .python-version pinned to 3.13.5
- .gitignore for Python/uv/OS artifacts
- .editorconfig for consistent formatting
- .env.example for deployment configuration
- src/daena package skeleton with version
- uv-managed virtual environment