- notify_parent: adds Reply-To set to the first CC (admin) address so
parent replies to the completion confirmation reach the admin rather
than re-entering the agent pipeline
- notify_admin / notify_registration_update: Reply-To = parent email
was already wired through _send(); confirmed with new tests
- Mid-registration send_reply emails carry no Reply-To (verified by test)
- 5 new tests across TestNotifyParentReplyTo and TestNotifyAdminReplyTo;
1 new test in TestSendReplyNoAdminReplyTo (174 passing, 0 failing)
https://claude.ai/code/session_014NynTjALA5TeP85mbr5ZA8
specs/registration-notifications/spec.md:
- MODIFIED: parent confirmation email sent on completion (alongside admin)
- Bilingual body (de/en), QR-bill embedded inline, plain-text fallback
- Language persisted as metadata.language in registration record
tasks.md:
- 6 sections: qrbill dep, language persistence, notify_parent() impl,
wire into both completion sites (email agent + chat), tests, smoke test
https://claude.ai/code/session_01LjjK7RjKVnC8bETtccfgna
- Narrow the Non-Goal to just the QR-bill slip labels (SIX standard),
not the surrounding email body
- Add language field to RegistrationData via new metadata dataclass,
aligned with registration-schema.json metadata object
- Confirmation email body rendered in detected language (de/en)
- Two template dicts in notifier; admin notifications stay German-only
- Remove language-mismatch risk entry; replace with detection-accuracy note
https://claude.ai/code/session_01LjjK7RjKVnC8bETtccfgna
Covers: notify_parent() on AdminNotifier, multipart HTML email with
inline Swiss QR-bill (qrbill library), CHF 80 fixed payment data,
German default language, best-effort error handling.
https://claude.ai/code/session_01LjjK7RjKVnC8bETtccfgna
Parents currently receive no confirmation after submitting a registration.
This change adds an HTML confirmation email with full registration summary,
payment instructions, and a Swiss QR-bill for the CHF 80 registration fee.
https://claude.ai/code/session_01LjjK7RjKVnC8bETtccfgna
Creates the OpenSpec change directory for sending HTML confirmation
emails to parents on registration completion, including payment
instructions and Swiss QR-bill code.
https://claude.ai/code/session_01LjjK7RjKVnC8bETtccfgna
Key corrections from codebase analysis:
- Use `uv add chainlit` (not requirements.txt) — project already uses uv+pyproject.toml
- Remove .env.example task — file already exists with full config
- Add task to extend src/llm.py with stream_complete() using litellm streaming
instead of calling Anthropic SDK directly
- Reuse existing src/ modules directly in chat_app.py:
Config, KnowledgeBase, ConversationStore, AdminNotifier, prompts.py
- chat_app.py lives at project root (parallel to main.py), not in a new app/ dir
- Parse LLM response with existing _parse_llm_response logic from core.py
- Session state stored in cl.user_session, keyed by Chainlit session ID
https://claude.ai/code/session_01SUWzMzFvSfWiHXA2p6rPg9
Selects Chainlit as the chat UI library (AI-native, Python, handles
WebSocket/streaming/session out of the box). Establishes Python as the
project language. Documents accessibility gap mitigations (ARIA live
regions, focus management, reduced-motion, contrast overrides). Defines
project layout and Chainlit configuration.
https://claude.ai/code/session_01SUWzMzFvSfWiHXA2p6rPg9
Defines why the web chat is being built now, what changes (chat-interface
capability moving from spec to implementation), and adds accessibility as
a first-class requirement (WCAG 2.1 AA, keyboard nav, ARIA live regions).
https://claude.ai/code/session_01SUWzMzFvSfWiHXA2p6rPg9
Replace thread-ID-based conversation matching with email-address-based
matching for more reliable conversation continuity. Key changes:
- One conversation per email address (simpler model)
- No data expiration (conversations persist indefinitely)
- Post-completion support (questions and registration updates)
- Versioned storage for registration updates (audit trail)
- Admin notifications for registration changes
This addresses the gap where parents sending new emails (instead of
replying) would lose their registration progress.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Define complete non-technical scope for replacing Google Forms registration
with an AI-powered conversational agent. Includes:
- Registration data requirements (13 fields with validation rules)
- Knowledge base content (fees, regulations, schedule, FAQ from official PDFs)
- Conversation flow design with bilingual support (German/English)
- Agent personality guidelines (warm & friendly tone)
- Admin notification routing by playgroup type
- Email reminder system for incomplete registrations
- Data export formats (CSV/JSON)
- Channel configuration (email + chat)
- Release priorities (MVP scope defined)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>