7f55cdd204670f99a2ae2ab77ac47add3e4983b3
Covers every module in src/ with unit tests:
- tests/conftest.py shared fixtures (complete_registration, fresh_state, …)
- tests/test_models.py RegistrationData.is_complete(), to_dict/from_dict round-trips
- tests/test_storage.py normalize_email, _diff_registrations, ConversationStore CRUD,
registration versioning
- tests/test_llm.py litellm wrapper — message construction, model passthrough,
error propagation
- tests/test_agent.py EmailAgent — new/existing conversations, registration
completion, admin notification, fallback on LLM error,
JSON parsing, _apply_updates
- tests/test_notifier.py AdminNotifier routing, fee calculation, SMTP dispatch
- tests/test_knowledge_base.py KnowledgeBase loading and reload
All external I/O (litellm, SMTP, filesystem) is mocked. Tests run fast (~6s)
with no network access required.
https://claude.ai/code/session_01HaUFs7SaLD5SoiuGCY27Tw
Meister-Eder
Running the Email Agent
The email agent is a plain script invoked periodically via cron — no long-running daemon needed.
Scheduling with cron
*/5 * * * * flock -n /tmp/meister-eder-email.lock python /path/to/check_email.py
flock -n acquires an exclusive lock before running the script. If a previous run is still in progress when the next cron tick fires, the new invocation exits immediately (non-blocking). The lock is released automatically by the kernel when the process ends — even on crash — so stuck locks are not a concern.
Adjust */5 to whatever polling interval makes sense (e.g. */2 for every 2 minutes).
Languages
Python
90.9%
Jinja
4.5%
JavaScript
2.6%
CSS
1.7%
Dockerfile
0.3%