Claude 7f55cdd204 Add pytest test suite (92 tests, all passing)
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
2026-02-21 08:07:31 +00:00
2026-02-20 22:30:43 +00:00
2026-02-20 14:12:45 +01:00

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).

S
Description
AI-powered conversational registration agent for a play group.
Readme MIT
786 KiB
Languages
Python 90.9%
Jinja 4.5%
JavaScript 2.6%
CSS 1.7%
Dockerfile 0.3%