Add project scope documentation for AI playgroup registration system

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>
This commit is contained in:
2026-02-20 17:52:13 +01:00
co-authored by Claude Opus 4.5
parent 685bfbd03f
commit 145947c520
68 changed files with 9809 additions and 0 deletions
@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-02-20
@@ -0,0 +1,97 @@
# Agent Personality and Tone Guidelines
## Core Personality
The registration agent should feel like a helpful, friendly staff member of the playgroup—someone who genuinely cares about families and wants to make the registration process easy and welcoming.
## Tone
**Primary tone: Warm & Friendly**
- Use conversational, approachable language
- Be welcoming and encouraging
- Show genuine interest in the child and family
- Keep a positive, helpful attitude even when clarifying or correcting
### Do
- "That's wonderful! Let me help you get [child's name] registered."
- "No problem at all—let me know whenever you're ready to continue."
- "Great choice! The forest playgroup is very popular."
### Don't
- Overly formal: "Your registration request has been acknowledged."
- Robotic: "Please provide the following required fields."
- Impersonal: "The child's name field cannot be empty."
## Language
**Adaptive: Match the parent's language**
- Detect whether the parent writes in German or English
- Respond consistently in the same language throughout the conversation
- If unclear, default to German (local context: Fällanden, Switzerland)
### German Guidelines
- Use informal "du" rather than formal "Sie" (typical for playgroup context)
- Keep language simple and accessible
- Swiss German expressions are fine if the parent uses them
### English Guidelines
- Straightforward, clear English
- Avoid idioms that may not translate well
## Conversation Style
### Pacing
- Ask one or two questions at a time, not overwhelming lists
- Give parents space to respond naturally
- Don't rush—let the conversation flow
### Handling Mistakes
- Be understanding about typos or unclear responses
- Ask for clarification politely: "Just to make sure I got that right..."
- Never make parents feel they've done something wrong
### Answering Questions
- Provide helpful, complete answers
- If you don't have information, say so honestly
- Offer to connect them with the playgroup leader for complex questions
## Example Exchanges
### Starting a Registration
```
Parent: Hi, I want to register my daughter
Agent: Hi! How lovely—I'd be happy to help you register your daughter.
What's her name?
```
### Handling a Question Mid-Registration
```
Parent: Wait, how much does this cost?
Agent: Good question! The indoor playgroup is CHF 130 per month, and the
outdoor forest playgroup is CHF 250 per month. There's also a
one-time registration fee of CHF 80.
Would you like to continue with registration?
```
### Confirming Information
```
Agent: Let me make sure I have everything right:
- Emma, born March 15, 2022
- Indoor playgroup on Mondays and Wednesdays
- No special needs noted
Does that all look correct?
```
## Things to Avoid
- Sounding like a form or automated system
- Using technical jargon
- Being overly effusive or using too many exclamation marks
- Making assumptions about family structure
- Rushing parents through the process
@@ -0,0 +1,138 @@
# Channel Configuration
## Email Channel
### Registration Email Address
**Address:** `[To be determined]`
Suggested options:
- `anmeldung@familienvereinfaellanden.ch` (German: "registration")
- `spielgruppen@familien-verein.ch` (existing admin address - Markus Graf)
- `registration@familienvereinfaellanden.ch`
*Note: The existing admin email spielgruppen@familien-verein.ch could be used, or a new dedicated address could be created.*
### Requirements for Email Address
- Should be memorable and clear in purpose
- Associated with the organization's domain (preferred)
- Or a dedicated Gmail/other address if domain email not available
### Email Processing
- All emails to this address are processed by the AI agent
- Agent responds from the same address
- Thread tracking via email headers (In-Reply-To, References)
---
## Chat Interface
### Access URL
**URL:** `[To be determined]`
Suggested options:
- `https://familienvereinfaellanden.ch/anmeldung`
- `https://register.familienvereinfaellanden.ch`
- Embedded widget on existing website
### Branding Requirements
**Style:** Simple and neutral
| Element | Specification |
|---------|--------------|
| Color scheme | Clean, neutral colors (white background, subtle accent) |
| Logo | Optional - can include Familienverein logo if available |
| Typography | System fonts, readable and accessible |
| Layout | Mobile-first, clean chat bubble design |
### Welcome Message
**German (default):**
> Willkommen bei der Spielgruppe Pumuckl! Ich kann dir bei der Anmeldung deines Kindes helfen oder Fragen beantworten. Was möchtest du tun?
**English:**
> Welcome to Spielgruppe Pumuckl! I can help you register your child or answer questions. What would you like to do?
### Chat Interface Elements
- Chat message bubbles (agent vs parent visually distinct)
- Text input field
- Send button
- Typing indicator when agent is responding
- Minimal header with playgroup name
---
## Channel Selection Notes
Both channels lead to the same AI agent and registration system. The choice of channel is purely based on parent preference:
| Channel | Best for |
|---------|----------|
| Email | Parents who prefer asynchronous communication |
| Chat | Parents who want immediate, real-time interaction |
Registrations from both channels are stored in the same system and appear identical to the admin.
---
## Channel-Specific Behavior Differences
While both channels use the same AI agent and conversation logic, there are some inherent differences:
### Response Timing
| Aspect | Email | Chat |
|--------|-------|------|
| Response time | Near-instant (automated) | Real-time |
| Parent expectation | Can be async | Expects immediate reply |
| Session concept | Thread-based | Session-based |
### Conversation Flow
| Aspect | Email | Chat |
|--------|-------|------|
| Multiple questions | One per email preferred | Multiple turns easy |
| Length | Can be longer | Shorter, conversational |
| Formatting | Rich text, headers | Simple text, emojis OK |
### State Management
| Aspect | Email | Chat |
|--------|-------|------|
| Session timeout | No timeout (thread-based) | Session-based (browser) |
| Resumption | Automatic via thread | Same session required |
| Data retention | 1 month | Browser session duration |
| Reminders | Yes (Day 3, 10, 25) | No (session-based) |
### Error Handling
| Aspect | Email | Chat |
|--------|-------|------|
| Invalid input | Ask in next reply | Immediate correction |
| Dropped session | Follow-up email | Timeout message |
| Technical error | Error response email | Error message in chat |
### Unique Capabilities
**Email Only:**
- Can handle overnight/delayed responses naturally
- Parent can attach documents if needed
- Formal record via email threads
**Chat Only:**
- Typing indicators
- Immediate validation feedback
- More natural conversation flow
- Session can redirect to email if preferred
### Consistent Across Both
- Same AI agent personality
- Same registration data collected
- Same validation rules
- Same knowledge base access
- Same notification to admin
- Same data storage format
@@ -0,0 +1,365 @@
# Registration Conversation Flow
## Overview
The agent guides parents through registration in a natural conversation, collecting information in a logical sequence while allowing for questions and interruptions.
## Main Flow
```
START
┌─────────────────────────────────────┐
│ 1. GREETING & INTENT │
│ "Hi! I can help you register your │
│ child or answer questions about │
│ our playgroups. What would you │
│ like to do?" │
└─────────────────────────────────────┘
├── [Question about service] → Answer from knowledge base → Return
┌─────────────────────────────────────┐
│ 2. CHILD INFORMATION │
│ - Child's full name │
│ - Date of birth │
│ → Validate age (2-5 years) │
│ → If too young/old, inform parent │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 3. PLAYGROUP SELECTION │
│ "We have two playgroups:" │
│ - Indoor (Mon/Wed/Thu, 9-11:30) │
│ - Outdoor Forest (Mon, 9-14:00) │
│ "Which interests you?" │
│ │
│ → Collect selected type(s) │
│ → Collect selected days │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 4. SPECIAL NEEDS │
│ "Does your child have any special │
│ needs, allergies, or medical │
│ conditions we should know about?" │
│ │
│ → If yes: collect details │
│ → If no: note "None" and continue │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 5. PARENT/GUARDIAN CONTACT │
│ - Full name │
│ - Address (street, postal code, │
│ city) for invoicing │
│ - Phone number │
│ - Email address │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 6. EMERGENCY CONTACT │
│ "Please provide an emergency │
│ contact (someone other than │
│ yourself):" │
│ - Full name │
│ - Phone number │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 7. CONFIRMATION │
│ Display summary of all collected │
│ information │
│ "Is this correct?" │
│ │
│ → If corrections needed: go back │
│ → If confirmed: submit │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 8. COMPLETION │
│ "Registration complete!" │
│ - Mention registration fee (80.-) │
│ - Mention monthly fees │
│ - Provide contact for questions │
│ - Thank parent │
└─────────────────────────────────────┘
END
```
## Branch: Question Handling
At any point during registration, the parent can ask questions:
```
[Parent asks question]
┌─────────────────────────────────────┐
│ Query knowledge base │
│ → Provide answer │
│ → Ask: "Would you like to continue │
│ with registration?" │
└─────────────────────────────────────┘
[Return to previous step in flow]
```
## Branch: Age Validation
```
[Child's DOB collected]
┌─────────────────────────────────────┐
│ Calculate age │
│ │
│ Indoor: 2.5+ years │
│ Outdoor: 3+ years │
└─────────────────────────────────────┘
├── [Age OK] → Continue with playgroup selection
└── [Age outside range] →
"Your child is [age]. Our indoor playgroup
is for children 2.5+ and outdoor is for 3+.
Would you like to proceed anyway, or contact
us to discuss?"
```
## Information Collection Order
1. Child name → Personalize conversation
2. Child DOB → Validate eligibility early
3. Playgroup selection → Core booking decision
4. Special needs → Important safety/care info
5. Parent contact → Who to reach
6. Emergency contact → Safety requirement
7. Confirmation → Verify all correct
*Rationale: Child info first (topic of registration), then logistics, then parent details. Special needs before parent info so we can ask follow-up questions while still on child topic.*
---
## Mixed Intent Handling
Parents may combine registration with questions, or switch between intents mid-conversation. The agent should handle this gracefully.
### Scenario 1: Question During Registration
```
[Registration in progress at Step 3]
Parent: "By the way, what are the fees?"
Agent:
1. Acknowledge the question
2. Answer from knowledge base
3. Offer to return to registration
4. Wait for parent response
Example:
"Good question! The indoor playgroup is CHF 130/month and outdoor is
CHF 250/month. There's also a one-time CHF 80 registration fee.
Shall we continue with the registration? We were just about to pick
which days work for you."
```
### Scenario 2: Question-Only Intent (No Registration)
```
Parent: "I just have some questions about the playgroup"
Agent:
1. Acknowledge intent
2. Offer to answer questions
3. Don't push registration unless asked
Example:
"Of course! I'm happy to answer any questions. What would you like
to know?"
[After answering questions]
"Is there anything else you'd like to know? I'm also here if you
decide you'd like to register your child."
```
### Scenario 3: Starting with Question, Then Registration
```
Parent: "How much does it cost?"
Agent: [Answers fee question]
Agent: "Is there anything else you'd like to know?"
Parent: "No, I'd like to register my son"
Agent: "Great! Let's get started. What's your son's name?"
[Begin registration flow from Step 2]
```
### Scenario 4: Multiple Questions at Once
```
Parent: "What are the hours and how much does it cost?"
Agent:
1. Answer both questions together
2. Keep response organized but not overwhelming
Example:
"Happy to help with both!
**Hours:**
- Indoor: Mon/Wed/Thu, 9:00-11:30
- Outdoor: Mon, 9:00-14:00
**Fees:**
- Indoor: CHF 130/month
- Outdoor: CHF 250/month
- Registration: CHF 80 (one-time)
Anything else you'd like to know?"
```
### Scenario 5: Correction During Registration
```
[At confirmation step]
Parent: "Actually, I want to change the days"
Agent:
1. Acknowledge the change request
2. Go back to the relevant step
3. Re-collect only the changed information
4. Return to confirmation
Example:
"No problem! Which days would you like instead?"
[Collect new days]
"Got it. Let me update that... Here's the revised summary: [show again]"
```
### Intent Detection Guidelines
| Parent says... | Intent | Agent response |
|----------------|--------|----------------|
| "I want to register" | Registration | Start registration flow |
| "How much..." / "What are the fees..." | Question | Answer from knowledge base |
| "What time..." / "When is..." | Question | Answer from knowledge base |
| "Register + question in same message" | Mixed | Answer question first, then start registration |
| "Question mid-registration" | Mixed | Answer, then return to registration |
| "Just questions for now" | Question-only | Answer questions, don't push registration |
### Preserving Registration State
When handling questions mid-registration:
- Keep all collected data in memory
- Note which step we paused at
- Return to that exact step after answering
- Don't ask for already-collected information again
---
## Timeout and Resumption Behavior
### Chat Channel
**Session-Based Persistence**
The chat uses browser sessions to maintain state. There is no fixed inactivity timeout—as long as the session exists, the registration can be resumed.
```
[Parent closes browser or tab]
[Session ends]
[Parent returns with same session (e.g., reopens tab)]
Agent: "Welcome back! I still have your registration in progress.
We were at [current step]. Would you like to continue?"
[Parent returns without session (new browser/device)]
Agent: "Hi! Would you like to start a new registration?"
```
**Data Retention:**
- Incomplete registration data retained for the duration of the browser session
- If session is lost, parent starts fresh (no server-side persistence for chat)
- For longer breaks, recommend email channel
### Email Channel
**No timeout** - email is inherently asynchronous
```
[Parent sends email, agent responds]
[Parent doesn't reply for days/weeks]
[Parent sends another email in the thread]
Agent:
1. Detect existing conversation from email thread
2. Load previously collected data
3. Continue from where we left off
Example:
"Hi again! I still have the registration in progress for Emma.
We just need your emergency contact details to finish up.
Who should we contact in case of emergency?"
```
**Email Data Retention:**
- Registration data retained for **1 month** in email conversations
- After 1 month without response, data cleared
### Reminder Emails
**Automated reminders for incomplete registrations:**
| Timing | Action |
|--------|--------|
| Day 3 | First reminder: "Just checking in—would you like to complete [child name]'s registration?" |
| Day 10 | Second reminder: "We still have your registration saved. Ready to finish?" |
| Day 25 | Final reminder: "Your registration will expire in 5 days. Complete it now or start fresh later." |
| Day 30 | Data cleared (no email sent) |
**Reminder Rules:**
- Only sent for email channel (chat is session-based)
- Stop sending if parent replies or completes registration
- Stop sending if parent explicitly says they're no longer interested
- Maximum 3 reminders per incomplete registration
### Resumption Messages
**Chat - Short absence (< 5 minutes):**
No special message needed, just continue
**Chat - Medium absence (5-30 minutes):**
> "Welcome back! Ready to continue? We were collecting your contact details."
**Chat - Return after session end:**
> "Hi again! I found your earlier registration for [child name]. Would you like to pick up where we left off, or start fresh?"
**Email - After days of silence:**
> "Hi [parent name], just following up on [child name]'s registration. I have most of the details saved—we just need [remaining fields]. Would you like to continue?"
### Incomplete Registration Handling
If a parent abandons registration:
1. Data is NOT submitted to the admin
2. No notification sent for incomplete registrations
3. Data cleared after retention period
4. If parent returns: offer to resume or start fresh
### Privacy Considerations
- Clear incomplete data after retention period
- Don't send reminders to parents who explicitly say they're not interested
- Maximum of 1 reminder email per incomplete registration
@@ -0,0 +1,215 @@
# Data Export Formats
## CSV Export
### Filename Format
```
registrations_[YYYY-MM-DD].csv
registrations_[YYYY-MM-DD]_indoor.csv
registrations_[YYYY-MM-DD]_outdoor.csv
```
### Column Structure
| Column | Description | Example |
|--------|-------------|---------|
| registration_id | Unique identifier | REG-2024-001 |
| submitted_at | Submission date/time | 2024-09-15 14:30:00 |
| channel | Registration channel | email / chat |
| child_name | Child's full name | Emma Müller |
| child_dob | Date of birth | 2021-03-15 |
| child_age_years | Age in years | 3 |
| child_age_months | Additional months | 6 |
| special_needs | Special needs/medical | Peanut allergy |
| playgroup_types | Selected types | indoor,outdoor |
| selected_days | Booked days | monday,wednesday |
| monthly_fee | Calculated fee | 130 |
| parent_name | Parent/guardian name | Maria Müller |
| parent_address | Street address | Sunnetalstrasse 12 |
| parent_postal_code | Postal code | 8117 |
| parent_city | City | Fällanden |
| parent_phone | Phone number | +41 79 123 45 67 |
| parent_email | Email address | maria@example.com |
| emergency_name | Emergency contact name | Hans Müller |
| emergency_phone | Emergency contact phone | +41 79 987 65 43 |
### CSV Formatting Rules
- UTF-8 encoding (for German characters: ä, ö, ü, etc.)
- Comma-separated values
- Values with commas wrapped in quotes
- Header row included
- Date format: YYYY-MM-DD
- DateTime format: YYYY-MM-DD HH:MM:SS
---
## JSON Export
### Single Registration
```json
{
"registrationId": "REG-2024-001",
"child": {
"fullName": "Emma Müller",
"dateOfBirth": "2021-03-15",
"specialNeeds": "Peanut allergy"
},
"parentGuardian": {
"fullName": "Maria Müller",
"phone": "+41 79 123 45 67",
"email": "maria@example.com"
},
"emergencyContact": {
"fullName": "Hans Müller",
"phone": "+41 79 987 65 43"
},
"booking": {
"playgroupTypes": ["indoor"],
"selectedDays": [
{"day": "monday", "type": "indoor"},
{"day": "wednesday", "type": "indoor"}
]
},
"metadata": {
"submittedAt": "2024-09-15T14:30:00Z",
"channel": "chat",
"conversationId": "conv-abc123"
}
}
```
### Bulk Export (Array)
```json
{
"exportedAt": "2024-09-20T10:00:00Z",
"totalRecords": 25,
"filters": {
"dateFrom": "2024-09-01",
"dateTo": "2024-09-30",
"playgroupType": null
},
"registrations": [
{ ... },
{ ... }
]
}
```
---
## Export Use Cases
| Use Case | Recommended Format |
|----------|-------------------|
| Import to Google Sheets | CSV |
| Backup/archive | JSON |
| Integration with other systems | JSON |
| Quick overview/printing | CSV |
| Data analysis | Either (CSV for Excel, JSON for scripts) |
---
## Admin Workflow Integration
### Current Workflow (Google Forms)
1. Parent fills Google Form
2. Data appears in Google Sheet automatically
3. Admin receives email notification
4. Admin reviews in spreadsheet
### New Workflow (AI Registration)
1. Parent converses with AI agent
2. Completed registration stored in system
3. Admin receives email notification (same as before)
4. Admin can:
- View individual registrations in admin interface
- Export to CSV for Google Sheets compatibility
- Export to JSON for archival/backup
### Maintaining Google Sheets Compatibility
For admins who prefer working in Google Sheets:
**Option A: Manual Import**
1. Export CSV from the system
2. Import into Google Sheets (File → Import)
3. Work with data as before
**Option B: Direct Google Sheets Integration (Future)**
- Automatic sync to a designated Google Sheet
- Requires Google API setup
- *Note: This is a potential future enhancement, not initial release*
### Export Triggers
| Trigger | Action |
|---------|--------|
| Admin clicks "Export" | Generate CSV/JSON download |
| Scheduled (optional) | Auto-generate weekly export |
| API request (optional) | Return JSON for integrations |
### Data Consistency
- Exports always reflect current stored data
- Registration IDs are consistent across exports
- Timestamps are consistent (UTC internally, local time in exports)
---
## Filtering and Query Requirements
### Export Filters
When exporting data, the admin should be able to filter by:
| Filter | Options | Use Case |
|--------|---------|----------|
| Date range | From/To dates | "Show September registrations" |
| Playgroup type | Indoor / Outdoor / Both | "Export only forest playgroup kids" |
| Booking day | Monday / Wednesday / Thursday | "Who's coming on Wednesdays?" |
| Channel | Email / Chat | "How many registered via chat?" |
### Query Examples
**All registrations this month:**
```
dateFrom: 2024-09-01
dateTo: 2024-09-30
```
**Forest playgroup registrations:**
```
playgroupType: outdoor
```
**Monday attendees (both playgroups):**
```
bookingDay: monday
```
**Recent registrations via chat:**
```
dateFrom: 2024-09-15
channel: chat
```
### Combination Filters
Filters can be combined:
- "All outdoor registrations in September"
- "Monday indoor kids registered via email"
### Sort Options
| Sort by | Direction |
|---------|-----------|
| Submission date | Newest first (default) / Oldest first |
| Child name | A-Z / Z-A |
| Playgroup type | Indoor first / Outdoor first |
### Default Export Behavior
If no filters specified:
- All registrations
- Sorted by submission date (newest first)
- All fields included
@@ -0,0 +1,25 @@
# Knowledge Base
This directory contains the information the AI agent uses to answer parent questions about the playgroup service.
## Files
| File | Content |
|------|---------|
| `fees.md` | Pricing, payment terms, discounts |
| `schedule.md` | Opening hours, locations, contacts |
| `regulations.md` | Policies, rules, requirements |
| `faq.md` | Frequently asked questions |
## Maintenance
To update information the agent provides:
1. Edit the relevant markdown file
2. Changes take effect immediately (no code deployment needed)
## Format Guidelines
- Use clear headings and sections
- Keep answers concise but complete
- Use tables for structured data (fees, schedules)
- Mark placeholders with `*[To be completed]*`
@@ -0,0 +1,121 @@
# Frequently Asked Questions
## Registration & Enrollment
### What age does my child need to be?
Children are admitted two years before kindergarten entry. This is typically:
- Indoor Playgroup: approximately 2.5 years or older
- Outdoor Forest Playgroup: 3 years or older
### How do I register my child?
You can register by chatting with our registration assistant or sending an email. The assistant will guide you through providing all necessary information.
### Is there a registration fee?
Yes, there is a one-time registration fee of CHF 80.- for the first year. From the second year onwards, a CHF 80.- craft materials fee is charged instead.
### Can my child attend both the indoor and outdoor playgroups?
Yes! Children can be enrolled in either playgroup, both, or any combination of available days.
### Is there a priority for admission?
Yes, members and families residing in Fällanden, Benglen, and Pfaffhausen are given priority admission.
### Is there a trial period?
Yes, the first month is a trial period. Exit during the trial period is possible at the end of the month.
---
## Fees & Payment
### How much does it cost?
**Indoor Playgroup:**
- 1x per week: CHF 130.-/month
- 2x per week: CHF 260.-/month
- 3x per week: CHF 390.-/month
**Outdoor Forest Playgroup:**
- CHF 250.-/month (includes snack and lunch)
**July and August are fee-free.**
### Is there a sibling discount?
Yes, there is a 10% discount on the monthly fee for each additional child from the same family.
### How do I pay?
Invoices are sent monthly via email. Fees must be paid in advance. We recommend setting up a standing payment order (Dauerauftrag).
### What about the cleaning deposit?
For the indoor playgroup, parents pay a CHF 50.- deposit which is returned through participation in cleaning sessions (3x per year).
---
## Schedule
### What are the playgroup hours?
- Indoor (Mon, Wed, Thu): 9:00 - 11:30
- Outdoor Forest (Mon): 9:00 - 14:00
### Does the playgroup run during school holidays?
No, the playgroup follows the Fällanden school calendar. No sessions during school holidays or official public holidays.
### Can I change my child's playgroup days?
Yes, changes are possible at the start of each month after consultation with the playgroup leader. For reductions, a one-month notice period applies.
---
## Cancellation
### What is the cancellation policy?
- Cancellation must be in writing
- 30 days notice before end of quarter (October, January, April, July)
- During trial period (first month): exit possible at end of month
---
## Illness & Absences
### What if my child is sick?
Sick children cannot be cared for. Please keep your child home if they are unwell.
### Do I still pay if my child is absent?
Yes, absence due to illness or vacation does not exempt from payment. Please notify the playgroup leader of planned absences at least 14 days in advance.
---
## Outdoor Playgroup Specific
### What happens if the weather is bad?
The outdoor forest playgroup runs in nearly all weather conditions. Children should come dressed appropriately for the weather.
### Is lunch included?
Yes, the forest playgroup fee includes snack (Znüni) and lunch.
---
## Insurance & Safety
### Does the playgroup provide insurance?
No, accident insurance is the responsibility of the parents. Parents are also liable for damages caused by their children. We recommend having private liability insurance.
### What happens in an emergency?
In emergencies, the child will be treated by the nearest emergency doctor in Fällanden.
### Can someone else pick up my child?
Yes, but you must inform the playgroup leader in advance if someone other than yourself will pick up your child.
---
## Contact
**Administration:**
Markus Graf - Tel: 079 261 16 37 - spielgruppen@familien-verein.ch
**Indoor Playgroup:**
Andrea Sigrist & Kübra Karatas - Tel: 079 674 99 92 - andrea.sigrist@gmx.net
**Outdoor Playgroup:**
Barbara Gross - Tel: 078 761 19 64 - baba.laeubli@gmail.com
---
*Have other questions? Just ask our registration assistant!*
@@ -0,0 +1,75 @@
# Service Fees (Tarifliste 2024/2025)
*Source: Tarifliste Spielgruppen 2024/2025, Familienverein Fällanden*
## Indoor Playgroup (Innenspielgruppe)
**Hours:** Monday, Wednesday, or Thursday, 9:00 - 11:30
| Sessions per Week | Monthly Fee |
|-------------------|-------------|
| 1x per week | CHF 130.- |
| 2x per week | CHF 260.- |
| 3x per week | CHF 390.- |
**July and August are fee-free.**
---
## Outdoor Forest Playgroup (Waldspielgruppe)
**Hours:** Monday, 9:00 - 14:00
| Monthly Fee |
|-------------|
| CHF 250.- |
*Includes snack (Znüni) and lunch.*
**July and August are fee-free.**
---
## One-Time Fees
| Fee | Amount | When |
|-----|--------|------|
| Registration Fee (Aufnahmegebühr) | CHF 80.- | First year only |
| Craft Materials (Bastelmaterial) | CHF 80.- | From second year onwards (replaces registration fee) |
| Parent Participation Deposit | CHF 50.- | Indoor playgroup only (refundable through cleaning participation) |
---
## Payment Terms
- Invoicing is monthly via email
- Fees must be paid in advance
- Standing payment order (Dauerauftrag) is recommended for regular payments
---
## Sibling Discount
10% discount on monthly fees for each additional child from the same family.
---
## Administration Contact
Markus Graf
Tel: 079 261 16 37
Email: spielgruppen@familien-verein.ch
---
## Playgroup Leaders
**Indoor Playgroup:**
Andrea Sigrist & Kübra Karatas
Tel: 079 674 99 92
Email: andrea.sigrist@gmx.net
**Forest Playgroup:**
Barbara Gross
Tel: 078 761 19 64 / 044 825 25 13
Email: baba.laeubli@gmail.com
@@ -0,0 +1,110 @@
# Playgroup Regulations (Reglement)
*Source: Reglement Spielgruppe 2024, Familienverein Fällanden*
## Aufnahme (Admission)
- Children are admitted two years before kindergarten entry
- Indoor playgroup: 8-11 children per group, mixed ages
- Forest playgroup: maximum 10 children, mixed ages
- No playgroup during school holidays (per Fällanden school calendar) and official holidays
- The playgroup year follows the school year
- Registration requires signing an admission contract and paying the CHF 80.- registration fee
### Priorität (Priority)
Members and families residing in Fällanden, Benglen, and Pfaffhausen are given priority admission.
---
## Versicherung (Insurance)
- Accident insurance is the responsibility of the parents
- Parents are liable for damages caused by their children
- Parents are recommended to have private liability insurance
---
## Ferien und Krankheit (Holidays and Illness)
- **Sick children cannot be cared for**
- Absence due to illness or vacation does not exempt from payment obligation
- Holiday absences should be announced to the playgroup leader at least 14 days in advance
---
## Elternbeiträge und Tarif (Fees and Payment)
- Fees are listed in the current Familienverein Fällanden fee schedule
- Fees must be paid in advance
- Invoicing is monthly via email
- Standing payment orders (Dauerauftrag) are recommended
---
## Probezeit und Kündigung (Trial Period and Cancellation)
### Trial Period
- The first month is a trial period
- Exit during the trial period is possible at the end of the month
### Cancellation Terms
- Cancellation must be submitted in writing
- Notice period: 30 days before end of quarter (October, January, April, July)
- Early departure: fees charged until end of notice period
### Termination by Playgroup
The care relationship may be terminated immediately if:
- A child's behavior causes persistent difficulties despite intensive efforts
- There are unjustified payment arrears
Termination is issued by the playgroup leader or the responsible board member.
---
## Betreuungszeiten (Care Times)
- Care times are defined in the admission contract and adjusted based on capacity
- Changes to playgroup days are possible at the start of each month after consultation with the playgroup leader
- For reductions, the one-month notice period applies
---
## Allgemeines (General)
### Emergencies
- In emergencies, the child will be treated by the nearest emergency doctor in Fällanden
### Liability
- Parents are liable for willful damage to furniture and buildings
### Personal Items
- Children and parents are responsible for toys brought without being asked
- The playgroup does not replace defective or lost items
### Pickup
- Parents who have their children picked up by other persons must inform the playgroup leader in advance
---
## Elternarbeit (Parent Participation) - Indoor Playgroup Only
- Parents pay a CHF 50.- deposit
- Deposit is returned through participation in cleaning sessions
- Cleaning occurs three times per year (announced in advance)
- Unreturned deposits remain with the playgroup
---
## Bastelmaterial (Craft Materials)
- From the second year onwards, a CHF 80.- craft material fee is charged instead of the registration fee
---
## Gültigkeit (Validity)
- This regulation is a binding agreement between parents and Familienverein Fällanden
- The board reserves the right to adapt the regulations to current circumstances
- The board decides on exceptions
- The statutes of Familienverein Fällanden (March 2005) apply additionally
@@ -0,0 +1,40 @@
# Opening Hours and Schedule
## Indoor Playgroup (Spielgruppe Pumuckl)
| Day | Time |
|-----|------|
| Monday | 9:00 - 11:30 |
| Wednesday | 9:00 - 11:30 |
| Thursday | 9:00 - 11:30 |
**Location**: Sunnetalstrasse 4, 8117 Fällanden
**Contact**: Andrea Sigrist
- Phone: 079 674 99 92
- Email: andrea.sigrist@gmx.net
## Outdoor Forest Playgroup (Waldspielgruppe Pumuckl)
| Day | Time |
|-----|------|
| Monday | 9:00 - 14:00 |
**Contact**: Barbara Gross
- Phone: 078 761 19 64 / 044 825 25 13
- Email: baba.laeubli@gmail.com
## Important Notes
- Sessions operate during school term only (school holidays excluded)
- The outdoor playgroup runs in nearly all weather conditions
- Children can be enrolled in either playgroup, both, or any combination of available days
## Age Requirements
- Indoor Playgroup: Children approximately 2.5 years and older
- Outdoor Forest Playgroup: Children aged 3 and older
## Availability
Spots may be limited. Contact the playgroup leader to check current availability.
@@ -0,0 +1,125 @@
# Admin Notification Email Template
## Subject Line
```
New Registration: [Child Name] for [Playgroup Type]
```
Examples:
- `New Registration: Emma Müller for Indoor Playgroup`
- `New Registration: Luca Weber for Indoor + Outdoor Playgroup`
## Email Body
```
===============================================
NEW PLAYGROUP REGISTRATION
===============================================
Submitted: [Date] at [Time]
Channel: [Email / Chat]
-----------------------------------------------
CHILD INFORMATION
-----------------------------------------------
Name: [Child's Full Name]
Date of Birth: [DOB] (Age: [calculated age])
Special Needs: [Details or "None"]
-----------------------------------------------
PLAYGROUP SELECTION
-----------------------------------------------
Type: [Indoor / Outdoor / Both]
Days: [Monday, Wednesday, Thursday]
Monthly Fee: CHF [amount]
(Plus CHF 80 registration fee if first enrollment)
-----------------------------------------------
PARENT/GUARDIAN
-----------------------------------------------
Name: [Parent Name]
Address: [Street Address]
[Postal Code] [City]
Phone: [Phone Number]
Email: [Email Address]
-----------------------------------------------
EMERGENCY CONTACT
-----------------------------------------------
Name: [Emergency Contact Name]
Phone: [Emergency Contact Phone]
===============================================
This registration was submitted via the automated
registration assistant.
[View full registration record →]
```
## HTML Version (Optional)
For better formatting in email clients, an HTML version can include:
- Playgroup logo in header
- Color-coded sections
- Clickable phone/email links
- Button to view full record
## Notification Settings
**Send timing:** Immediately upon registration completion
**Reply-to:** Set to parent's email so admin can reply directly
### Routing by Playgroup Type
| Registration Type | Send Notification To |
|-------------------|---------------------|
| Indoor only | Andrea Sigrist (andrea.sigrist@gmx.net) |
| Outdoor only | Barbara Gross (baba.laeubli@gmail.com) |
| Both Indoor + Outdoor | Both Andrea AND Barbara |
| All registrations (CC) | Administration: Markus Graf (spielgruppen@familien-verein.ch) |
*Note: When a child registers for both playgroups, both leaders receive the full notification. The administration is CC'd on all registrations.*
---
## Fields Included in Notification
### Always Included (Required Fields)
| Field | Source | Format |
|-------|--------|--------|
| Child's Full Name | registration.child.fullName | As entered |
| Date of Birth | registration.child.dateOfBirth | DD.MM.YYYY |
| Calculated Age | Computed from DOB | "X years, Y months" |
| Special Needs | registration.child.specialNeeds | As entered |
| Playgroup Type(s) | registration.booking.playgroupTypes | "Indoor" / "Outdoor" / "Indoor + Outdoor" |
| Selected Days | registration.booking.selectedDays | Comma-separated list |
| Monthly Fee | Computed from selection | "CHF X.-" |
| Parent Name | registration.parentGuardian.fullName | As entered |
| Parent Address | registration.parentGuardian.streetAddress | As entered |
| Parent Postal Code | registration.parentGuardian.postalCode | As entered |
| Parent City | registration.parentGuardian.city | As entered |
| Parent Phone | registration.parentGuardian.phone | As entered |
| Parent Email | registration.parentGuardian.email | As entered |
| Emergency Contact Name | registration.emergencyContact.fullName | As entered |
| Emergency Contact Phone | registration.emergencyContact.phone | As entered |
| Submission Timestamp | registration.metadata.submittedAt | DD.MM.YYYY HH:MM |
| Channel | registration.metadata.channel | "Email" / "Chat" |
### Computed Fields
| Field | Calculation |
|-------|-------------|
| Age | Current date - DOB, formatted as years and months |
| Monthly Fee | Indoor: 130, Outdoor: 250, Both: 380 (before sibling discount) |
### Not Included in Notification
- Conversation ID (internal tracking only)
- Full conversation history
- Previous registration attempts
@@ -0,0 +1,62 @@
# Registration Fields
## Required Fields
### Child Information
| Field | Description | Required |
|-------|-------------|----------|
| Child's Full Name | First and last name of the child | Yes |
| Date of Birth | Child's date of birth | Yes |
| Special Needs / Medical Conditions | Any special requirements, allergies, medical conditions, or additional needs | Yes |
### Parent/Guardian Information
| Field | Description | Required |
|-------|-------------|----------|
| Parent/Guardian Name | Full name of primary contact | Yes |
| Street Address | Street name and house number | Yes |
| Postal Code | Swiss postal code (e.g., 8117) | Yes |
| City | City/town name | Yes |
| Phone Number | Contact phone number | Yes |
| Email Address | Contact email address | Yes |
### Emergency Contact
| Field | Description | Required |
|-------|-------------|----------|
| Emergency Contact Name | Name of alternative contact person | Yes |
| Emergency Contact Phone | Phone number for emergency contact | Yes |
### Booking Selection
| Field | Description | Required |
|-------|-------------|----------|
| Playgroup Type(s) | Indoor, Outdoor (Forest), or both | Yes |
| Booking Days | Selected days based on playgroup type | Yes |
#### Available Booking Options
**Indoor Playgroup** (9:00 AM - 11:30 AM)
- Monday
- Wednesday
- Thursday
**Outdoor Forest Playgroup** (9:00 AM - 2:00 PM)
- Monday
*Note: Parents can register for either type, both types, or any combination of available days.*
## Optional Fields
None. All registration fields are required.
---
## Summary
Total required fields: **13**
- Child: 3 fields (name, DOB, special needs)
- Parent: 6 fields (name, address, postal code, city, phone, email)
- Emergency: 2 fields (name, phone)
- Booking: 2 fields (type selection, day selection)
@@ -0,0 +1,137 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "PlaygroupRegistration",
"description": "Schema for playgroup child registration data",
"type": "object",
"required": [
"child",
"parentGuardian",
"emergencyContact",
"booking",
"metadata"
],
"properties": {
"child": {
"type": "object",
"required": ["fullName", "dateOfBirth", "specialNeeds"],
"properties": {
"fullName": {
"type": "string",
"minLength": 2,
"description": "Child's full name (first and last)"
},
"dateOfBirth": {
"type": "string",
"format": "date",
"description": "Child's date of birth (YYYY-MM-DD)"
},
"specialNeeds": {
"type": "string",
"description": "Special needs, medical conditions, allergies, or 'None'"
}
}
},
"parentGuardian": {
"type": "object",
"required": ["fullName", "streetAddress", "postalCode", "city", "phone", "email"],
"properties": {
"fullName": {
"type": "string",
"minLength": 2,
"description": "Parent/guardian full name"
},
"streetAddress": {
"type": "string",
"description": "Street name and house number"
},
"postalCode": {
"type": "string",
"pattern": "^[0-9]{4}$",
"description": "Swiss postal code (4 digits)"
},
"city": {
"type": "string",
"description": "City/town name"
},
"phone": {
"type": "string",
"description": "Contact phone number"
},
"email": {
"type": "string",
"format": "email",
"description": "Contact email address"
}
}
},
"emergencyContact": {
"type": "object",
"required": ["fullName", "phone"],
"properties": {
"fullName": {
"type": "string",
"minLength": 2,
"description": "Emergency contact full name"
},
"phone": {
"type": "string",
"description": "Emergency contact phone number"
}
}
},
"booking": {
"type": "object",
"required": ["playgroupTypes", "selectedDays"],
"properties": {
"playgroupTypes": {
"type": "array",
"items": {
"type": "string",
"enum": ["indoor", "outdoor"]
},
"minItems": 1,
"description": "Selected playgroup type(s)"
},
"selectedDays": {
"type": "array",
"items": {
"type": "object",
"required": ["day", "type"],
"properties": {
"day": {
"type": "string",
"enum": ["monday", "wednesday", "thursday"]
},
"type": {
"type": "string",
"enum": ["indoor", "outdoor"]
}
}
},
"minItems": 1,
"description": "Selected booking days with playgroup type"
}
}
},
"metadata": {
"type": "object",
"required": ["submittedAt", "channel"],
"properties": {
"submittedAt": {
"type": "string",
"format": "date-time",
"description": "Registration submission timestamp"
},
"channel": {
"type": "string",
"enum": ["email", "chat"],
"description": "Channel through which registration was completed"
},
"conversationId": {
"type": "string",
"description": "Unique identifier for the registration conversation"
}
}
}
}
}
@@ -0,0 +1,58 @@
# Release Priorities
## Initial Release (MVP)
### Core Capabilities
| Feature | Priority | Notes |
|---------|----------|-------|
| Chat interface | Must have | Web-based, mobile-responsive |
| Email channel | Must have | Full email conversation support |
| Conversational registration | Must have | Guided data collection via AI |
| Knowledge base Q&A | Must have | Fees, schedule, policies, FAQ |
| Bilingual support | Must have | German and English |
| Registration data storage | Must have | Structured JSON format |
| Admin notifications | Must have | Routed by playgroup type |
| Email reminders | Must have | Day 3, 10, 25 for incomplete registrations |
| Data export | Must have | CSV and JSON formats |
### Data Collected
All 13 required fields:
- Child: name, DOB, special needs
- Parent: name, address, postal code, city, phone, email
- Emergency: name, phone
- Booking: playgroup type(s), days
---
## Phase 2 (Future Enhancements)
| Feature | Priority | Notes |
|---------|----------|-------|
| Telegram bot | Nice to have | Additional channel |
| WhatsApp integration | Nice to have | Additional channel |
| Google Sheets sync | Nice to have | Direct integration vs. export |
| Capacity/waitlist | Consider | Auto-check if spots available |
| Sibling batch registration | Consider | Register multiple children at once |
---
## Out of Scope
| Feature | Reason |
|---------|--------|
| Payment processing | Admin handles invoicing separately |
| Calendar booking | Not needed for registration |
| Parent accounts/login | Registration is one-time flow |
| Mobile app | Web chat is mobile-responsive |
---
## Success Criteria for Initial Release
1. Parents can complete registration via chat OR email
2. Agent answers common questions from knowledge base
3. Admin receives notification with all registration details
4. Incomplete registrations receive automated reminders
5. Admin can export registration data in CSV/JSON
@@ -0,0 +1,205 @@
# Sample Agent Responses
## Registration Flow Responses
### Greeting / Start
**English:**
> Hi! I can help you register your child for our playgroup or answer any questions you might have. What would you like to do today?
**German:**
> Hallo! Ich kann dir helfen, dein Kind für unsere Spielgruppe anzumelden oder Fragen zu beantworten. Was möchtest du heute machen?
### Asking for Child's Name
**English:**
> Great, let's get started! What's your child's name?
**German:**
> Super, dann legen wir los! Wie heisst dein Kind?
### Asking for Date of Birth
**English:**
> Lovely name! And when was [child's name] born?
**German:**
> Schöner Name! Und wann ist [child's name] geboren?
### Explaining Playgroup Options
**English:**
> We have two playgroup options:
>
> **Indoor Playgroup** - Monday, Wednesday, and Thursday from 9:00 to 11:30
>
> **Outdoor Forest Playgroup** - Monday from 9:00 to 14:00
>
> You can choose either, both, or any combination of days. Which interests you?
**German:**
> Wir haben zwei Spielgruppen:
>
> **Spielgruppe drinnen** - Montag, Mittwoch und Donnerstag von 9:00 bis 11:30
>
> **Waldspielgruppe draussen** - Montag von 9:00 bis 14:00
>
> Du kannst eine, beide oder eine beliebige Kombination wählen. Was interessiert dich?
### Asking About Special Needs
**English:**
> Does [child's name] have any special needs, allergies, or medical conditions we should know about?
**German:**
> Hat [child's name] besondere Bedürfnisse, Allergien oder gesundheitliche Dinge, die wir wissen sollten?
### Asking for Parent Contact
**English:**
> Now I need your contact details. What's your full name?
**German:**
> Jetzt brauche ich deine Kontaktdaten. Wie ist dein vollständiger Name?
### Asking for Address
**English:**
> And what's your address? We need this for invoicing. Please share your street, postal code, and city.
**German:**
> Und wie ist deine Adresse? Wir brauchen sie für die Rechnungsstellung. Bitte nenne mir Strasse, Postleitzahl und Ort.
### Asking for Emergency Contact
**English:**
> Almost done! Please provide an emergency contact—someone other than yourself we can reach if needed. What's their name and phone number?
**German:**
> Fast fertig! Bitte gib noch einen Notfallkontakt an—jemand anderen, den wir im Notfall erreichen können. Wie heisst die Person und wie ist ihre Telefonnummer?
### Confirmation Summary
**English:**
> Perfect! Here's what I have:
>
> **Child:** [name], born [date]
> **Playgroup:** [selection]
> **Days:** [days]
> **Special needs:** [info or "None"]
>
> **Your contact:**
> [parent name]
> [street address], [postal code] [city]
> [phone] / [email]
>
> **Emergency contact:**
> [name] - [phone]
>
> Is everything correct?
**German:**
> Perfekt! Hier ist die Zusammenfassung:
>
> **Kind:** [name], geboren am [date]
> **Spielgruppe:** [selection]
> **Tage:** [days]
> **Besondere Bedürfnisse:** [info oder "Keine"]
>
> **Deine Kontaktdaten:**
> [parent name]
> [street address], [postal code] [city]
> [phone] / [email]
>
> **Notfallkontakt:**
> [name] - [phone]
>
> Stimmt alles?
### Registration Complete
**English:**
> Wonderful—your registration is complete!
>
> Just so you know:
> - Registration fee: CHF 80 (one-time)
> - Monthly fee: [amount based on selection]
>
> The playgroup team will be in touch soon. If you have any questions, feel free to contact Andrea (indoor) at 079 674 99 92 or Barbara (outdoor) at 078 761 19 64.
>
> We look forward to welcoming [child's name]!
**German:**
> Wunderbar—deine Anmeldung ist abgeschlossen!
>
> Zur Info:
> - Einschreibegebühr: CHF 80 (einmalig)
> - Monatsbeitrag: [amount based on selection]
>
> Das Spielgruppen-Team wird sich bald melden. Bei Fragen kannst du Andrea (drinnen) unter 079 674 99 92 oder Barbara (draussen) unter 078 761 19 64 erreichen.
>
> Wir freuen uns auf [child's name]!
---
## Question-Answering Responses
### Fee Question
**English:**
> The indoor playgroup is CHF 130 per month, and the outdoor forest playgroup is CHF 250 per month. There's also a one-time registration fee of CHF 80. We offer a 10% sibling discount for additional children.
**German:**
> Die Spielgruppe drinnen kostet CHF 130 pro Monat und die Waldspielgruppe CHF 250 pro Monat. Dazu kommt eine einmalige Einschreibegebühr von CHF 80. Für Geschwister gibt es 10% Rabatt.
### Schedule Question
**English:**
> The indoor playgroup runs Monday, Wednesday, and Thursday from 9:00 to 11:30. The outdoor forest playgroup is on Mondays from 9:00 to 14:00. Both follow the school calendar—no sessions during school holidays.
**German:**
> Die Spielgruppe drinnen ist Montag, Mittwoch und Donnerstag von 9:00 bis 11:30. Die Waldspielgruppe ist montags von 9:00 bis 14:00. Beide folgen dem Schulkalender—in den Schulferien ist keine Spielgruppe.
### Age Question
**English:**
> The indoor playgroup is for children about 2.5 years and older. The outdoor forest playgroup is for children 3 years and older.
**German:**
> Die Spielgruppe drinnen ist für Kinder ab etwa 2.5 Jahren. Die Waldspielgruppe ist für Kinder ab 3 Jahren.
### Question Not in Knowledge Base
**English:**
> That's a great question, but I don't have that information. You might want to contact Andrea (indoor playgroup) at 079 674 99 92 or Barbara (outdoor playgroup) at 078 761 19 64—they'd be happy to help!
**German:**
> Gute Frage, aber das weiss ich leider nicht. Am besten fragst du Andrea (Spielgruppe drinnen) unter 079 674 99 92 oder Barbara (Waldspielgruppe) unter 078 761 19 64—die können dir sicher weiterhelfen!
---
## Error Handling Responses
### Invalid Email Format
**English:**
> Hmm, that email doesn't look quite right. Could you check and send it again?
**German:**
> Hmm, die E-Mail-Adresse sieht nicht ganz richtig aus. Kannst du sie nochmal überprüfen?
### Missing Information
**English:**
> I didn't quite catch that. Could you tell me [missing item] again?
**German:**
> Das habe ich nicht ganz verstanden. Kannst du mir [missing item] nochmal sagen?
### Child Too Young/Old
**English:**
> Based on [child's name]'s birthday, they're currently [age]. Our indoor playgroup is typically for children 2.5+ and the forest playgroup for 3+. Would you still like to proceed, or would you prefer to contact the playgroup leader to discuss?
**German:**
> Nach [child's name]s Geburtstag ist sie/er jetzt [age]. Unsere Spielgruppe drinnen ist normalerweise für Kinder ab 2.5 Jahren und die Waldspielgruppe ab 3 Jahren. Möchtest du trotzdem weitermachen oder lieber die Spielgruppenleiterin kontaktieren?
@@ -0,0 +1,45 @@
# Validation Rules
## Child Information
| Field | Validation Rules |
|-------|------------------|
| Child's Full Name | Required, minimum 2 characters, letters and spaces only |
| Date of Birth | Required, valid date format, must be in the past, child should be appropriate age for playgroup |
| Special Needs / Medical Conditions | Required, free text (parents can enter "None" if not applicable) |
## Parent/Guardian Information
| Field | Validation Rules |
|-------|------------------|
| Parent/Guardian Name | Required, minimum 2 characters, letters and spaces only |
| Street Address | Required, minimum 5 characters |
| Postal Code | Required, exactly 4 digits (Swiss format) |
| City | Required, minimum 2 characters |
| Phone Number | Required, valid phone number format |
| Email Address | Required, valid email format |
## Emergency Contact
| Field | Validation Rules |
|-------|------------------|
| Emergency Contact Name | Required, minimum 2 characters, letters and spaces only |
| Emergency Contact Phone | Required, valid phone number format |
## Booking Selection
| Field | Validation Rules |
|-------|------------------|
| Playgroup Type(s) | Required, at least one type must be selected (Indoor and/or Outdoor) |
| Booking Days | Required, at least one day must be selected, days must match selected playgroup type(s) |
### Booking Day Constraints
- If **Indoor** selected: Can choose from Monday, Wednesday, Thursday
- If **Outdoor (Forest)** selected: Must include Monday
- If **Both** selected: Can choose any combination of Mon, Wed, Thu (with Monday available in either/both programs)
## Notes
- The agent should guide parents through validation naturally (e.g., "Could you spell that again?" rather than "Invalid format")
- **Age validation**: Children must be between 2-5 years old at time of registration
@@ -0,0 +1,90 @@
## Context
This is a new project for a small business playgroup. Currently, parent registration is handled via Google Forms → Google Sheets → email notification workflow. This project replaces the static form with an AI-powered conversational agent that can both collect registration information and answer questions about the service.
**Current state**: No existing codebase; greenfield project.
**Stakeholders**:
- Playgroup admin (receives registrations, maintains knowledge base)
- Parents (interact with the agent to register and ask questions)
## Goals / Non-Goals
**Goals:**
- Create a conversational AI agent that guides parents through registration naturally
- Enable parents to ask questions about fees, regulations, policies during or outside registration
- Support two communication channels initially: email and web chat
- Store registration data in a structured, processable format
- Notify admin when registrations are completed
- Design for extensibility to add channels (Telegram, WhatsApp) later
**Non-Goals:**
- Payment processing or online booking confirmation
- Calendar/scheduling integration
- Parent accounts or login system
- Mobile app (web chat is mobile-responsive, not a native app)
- Automated approval of registrations (admin still reviews manually)
- Telegram/WhatsApp integration (documented as future extension)
## Decisions
### 1. Conversational AI Approach
**Decision**: Use an LLM-based agent with structured conversation flow and tool access.
**Rationale**: LLMs handle natural language well and can adapt to varied parent responses. A hybrid approach—LLM for conversation, structured schema for data collection—ensures flexibility while guaranteeing all required fields are captured.
**Alternatives considered**:
- Rule-based chatbot: Too rigid, poor handling of unexpected questions
- Pure LLM without structure: Risk of missing required fields
### 2. Channel Architecture
**Decision**: Implement a channel-agnostic core agent with adapter layer for each channel (email, chat).
**Rationale**: Separating the conversation logic from channel-specific handling allows adding new channels without modifying the core agent. Each adapter translates channel messages to/from a common format.
**Alternatives considered**:
- Separate agents per channel: Duplicates logic, harder to maintain consistency
- Single monolithic implementation: Harder to extend with new channels
### 3. Knowledge Base Storage
**Decision**: Store service information (fees, policies, FAQs) as structured documents the agent can query.
**Rationale**: Keeping knowledge separate from agent logic allows the admin to update information without code changes. The agent retrieves relevant context when answering questions.
**Alternatives considered**:
- Hardcoded responses: Inflexible, requires code changes for updates
- Full database: Overkill for relatively static content
### 4. Registration Data Storage
**Decision**: Store completed registrations as structured JSON/records with schema validation.
**Rationale**: Structured format enables export to various systems (spreadsheets, databases) and ensures data consistency. Schema validation catches incomplete registrations before storage.
**Alternatives considered**:
- Direct Google Sheets integration: Maintains familiarity but adds external dependency
- Unstructured storage: Harder to process and validate
### 5. Conversation State Management
**Decision**: Maintain conversation state per session, tracking collected fields and conversation history.
**Rationale**: Registration may span multiple messages (especially via email). State tracking ensures the agent knows what's been collected and what's still needed, and maintains context for follow-up questions.
## Risks / Trade-offs
**LLM reliability** → Implement validation layer that checks all required fields are collected before finalizing registration; agent prompts for missing information.
**Email latency** → Email channel has inherent delays; design conversation to be stateless between messages (state stored server-side, not dependent on immediate response).
**Knowledge base maintenance** → Admin must keep service information updated; provide simple format (markdown or structured files) that's easy to edit without technical skills.
**Channel consistency** → Different channels have different capabilities (email allows attachments, chat is real-time); define common capability baseline and document channel-specific limitations.
**Cost of LLM calls** → Each conversation turn uses LLM tokens; for a small playgroup this is likely negligible, but monitor usage and consider caching common Q&A responses.
## Open Questions
- What specific fields are required for registration? (Need to define the registration schema)
- What information should be included in the knowledge base? (Fees, hours, policies—need content from admin)
- Should email responses be instant (automated) or batched?
- What format does the admin prefer for accessing completed registrations?
- Should the chat interface require any form of identification before starting?
@@ -0,0 +1,42 @@
## Why
Managing playgroup registrations through Google Forms is static and impersonal. Parents fill out a long form without guidance, often missing details or providing incomplete information about special needs or booking preferences. This creates manual follow-up work and delays in processing registrations.
An AI-powered conversational registration agent can guide parents through the process naturally, ask clarifying questions when needed, and ensure all required information is collected before submission—improving the experience for parents while reducing administrative overhead.
## What Changes
- **Replace static form registration** with an interactive AI agent that converses with parents
- **Guided data collection**: The agent asks questions one at a time, adapting based on responses (e.g., asking follow-up questions about special needs only when relevant)
- **Context-aware assistant**: During the registration conversation (or independently), parents can ask questions about service fees, regulations, opening hours, policies, and other service-related information—the agent has access to this knowledge and responds naturally within the conversation flow
- **Multi-channel support**: Parents can register via email or a simple web chat interface
- **Structured data output**: All collected information is stored in a structured format for easy processing and integration with existing workflows
- **Email notifications**: Maintain notification flow when new registrations are completed
### Future Extensions
- Telegram bot integration
- WhatsApp integration
- Additional communication channels as needed
## Capabilities
### New Capabilities
- `conversational-registration`: AI agent that guides parents through the registration process via natural conversation, collecting child information (name, age, special needs, booking days) and validating completeness before submission
- `service-knowledge-base`: Curated information about the playgroup (fees, regulations, opening hours, policies, FAQs) that the AI agent can access to answer parent questions during or outside of registration
- `email-channel`: Email-based interaction where parents can register by exchanging emails with the AI agent
- `chat-interface`: Simple web-based chat interface for real-time registration conversations
- `registration-data-store`: Structured storage of registration data in a format suitable for further processing (replacing/complementing Google Sheets workflow)
- `registration-notifications`: Email notifications to admin when a new registration is completed
### Modified Capabilities
<!-- No existing specs to modify - this is a new project -->
## Impact
- **User Experience**: Parents interact with a conversational agent instead of filling out a static form; they can ask questions and get instant answers about fees, policies, etc.
- **Data Flow**: Registration data flows through the AI agent into structured storage, replacing direct Google Form → Spreadsheet flow
- **Admin Workflow**: Admin receives notifications, accesses structured registration data, and maintains the service knowledge base (fees, regulations, policies)
- **Infrastructure**: Requires hosting for the AI agent, chat interface, email processing, and knowledge base storage
- **External Dependencies**: AI/LLM service for conversational capabilities, email service for email channel
@@ -0,0 +1,52 @@
## ADDED Requirements
### Requirement: Web-based chat interface
The system SHALL provide a web-based chat interface where parents can interact with the AI agent in real-time.
#### Scenario: Parent accesses chat
- **WHEN** a parent navigates to the chat interface URL
- **THEN** they SHALL see a chat window ready for conversation
#### Scenario: Real-time messaging
- **WHEN** a parent sends a message in the chat
- **THEN** the agent's response SHALL appear without requiring a page refresh
### Requirement: Chat interface is mobile-responsive
The system SHALL provide a chat interface that works well on mobile devices and desktop browsers.
#### Scenario: Mobile device access
- **WHEN** a parent accesses the chat on a mobile device
- **THEN** the interface SHALL be usable without horizontal scrolling or zooming
#### Scenario: Desktop access
- **WHEN** a parent accesses the chat on a desktop browser
- **THEN** the interface SHALL utilize the available screen space appropriately
### Requirement: Chat displays conversation history
The system SHALL display the conversation history within the current session.
#### Scenario: Message history visible
- **WHEN** a parent is in an active chat session
- **THEN** they SHALL see all previous messages in the current conversation
#### Scenario: Clear message attribution
- **WHEN** viewing the chat history
- **THEN** parent messages and agent messages SHALL be visually distinguishable
### Requirement: Chat session management
The system SHALL manage chat sessions to maintain conversation context.
#### Scenario: Session persistence
- **WHEN** a parent refreshes the page during a chat session
- **THEN** the conversation history and state SHALL be preserved
#### Scenario: Session timeout notification
- **WHEN** a chat session has been inactive for an extended period
- **THEN** the system SHALL notify the parent before ending the session
### Requirement: Chat interface provides typing indicators
The system SHALL indicate when the agent is processing a response.
#### Scenario: Agent processing
- **WHEN** the agent is generating a response
- **THEN** the chat interface SHALL display a typing or processing indicator
@@ -0,0 +1,67 @@
## ADDED Requirements
### Requirement: Agent guides registration conversation
The system SHALL provide an AI agent that engages parents in natural conversation to collect child registration information.
#### Scenario: Parent initiates registration
- **WHEN** a parent starts a conversation with intent to register
- **THEN** the agent SHALL greet them and begin asking registration questions one at a time
#### Scenario: Agent adapts to responses
- **WHEN** a parent provides an answer that requires follow-up
- **THEN** the agent SHALL ask relevant clarifying questions before moving to the next topic
### Requirement: Agent collects required registration fields
The system SHALL collect all required information for a complete registration: child's name, child's age/date of birth, parent/guardian contact information, desired booking days, and any special needs or requirements.
#### Scenario: All required fields collected
- **WHEN** the agent has gathered all required registration fields
- **THEN** the agent SHALL confirm the collected information with the parent before submission
#### Scenario: Missing required field
- **WHEN** the parent attempts to complete registration with missing required fields
- **THEN** the agent SHALL identify and request the missing information
### Requirement: Agent handles special needs information
The system SHALL ask about special needs only when relevant and collect detailed information when indicated.
#### Scenario: Parent indicates special needs
- **WHEN** a parent indicates their child has special needs or requirements
- **THEN** the agent SHALL ask follow-up questions to understand the specific needs
#### Scenario: No special needs indicated
- **WHEN** a parent indicates no special needs
- **THEN** the agent SHALL proceed without additional special needs questions
### Requirement: Agent validates registration completeness
The system SHALL validate that all required fields are present and properly formatted before finalizing a registration.
#### Scenario: Valid registration data
- **WHEN** all required fields are collected and valid
- **THEN** the agent SHALL allow the registration to be submitted
#### Scenario: Invalid data format
- **WHEN** the parent provides data in an invalid format (e.g., invalid date, malformed email)
- **THEN** the agent SHALL politely request the information again with guidance on the expected format
### Requirement: Agent handles conversation interruptions
The system SHALL maintain conversation state and allow parents to resume interrupted registrations.
#### Scenario: Parent asks unrelated question mid-registration
- **WHEN** a parent asks a question about fees or policies during registration
- **THEN** the agent SHALL answer the question and offer to continue the registration
#### Scenario: Conversation timeout
- **WHEN** a registration conversation has been inactive for an extended period
- **THEN** the system SHALL preserve collected data and allow resumption when the parent returns
### Requirement: Agent supports conversation in natural language
The system SHALL understand varied phrasings and respond naturally rather than requiring specific keywords or commands.
#### Scenario: Varied input formats
- **WHEN** a parent provides information in different formats (e.g., "my son is 4" vs "he's four years old" vs "DOB: 2021-03-15")
- **THEN** the agent SHALL correctly interpret and extract the relevant information
#### Scenario: Natural language responses
- **WHEN** the agent responds to the parent
- **THEN** responses SHALL be conversational, friendly, and appropriate for parent communication
@@ -0,0 +1,45 @@
## ADDED Requirements
### Requirement: System receives parent emails
The system SHALL receive and process emails sent by parents to a designated registration email address.
#### Scenario: Parent sends initial email
- **WHEN** a parent sends an email to the registration address
- **THEN** the system SHALL process the email and pass it to the AI agent
#### Scenario: Parent replies to agent email
- **WHEN** a parent replies to an email from the agent
- **THEN** the system SHALL associate the reply with the existing conversation
### Requirement: Agent responds via email
The system SHALL send the AI agent's responses back to parents via email.
#### Scenario: Agent sends response
- **WHEN** the agent generates a response to a parent's message
- **THEN** the system SHALL send an email to the parent with the response
#### Scenario: Email formatting
- **WHEN** an email is sent to a parent
- **THEN** the email SHALL be properly formatted and readable in standard email clients
### Requirement: Email conversations maintain state
The system SHALL track email conversation threads and maintain registration state across multiple email exchanges.
#### Scenario: Multi-email registration
- **WHEN** a registration spans multiple email exchanges
- **THEN** the system SHALL maintain context and collected data throughout the conversation
#### Scenario: Conversation threading
- **WHEN** a parent continues an existing registration conversation
- **THEN** the system SHALL recognize the thread and resume from the previous state
### Requirement: Email channel handles asynchronous communication
The system SHALL handle the asynchronous nature of email without requiring immediate responses.
#### Scenario: Delayed parent response
- **WHEN** a parent takes hours or days to reply to an agent email
- **THEN** the system SHALL still correctly process the reply and continue the conversation
#### Scenario: Email delivery confirmation
- **WHEN** an email is sent to a parent
- **THEN** the system SHALL track delivery status for troubleshooting purposes
@@ -0,0 +1,56 @@
## ADDED Requirements
### Requirement: Store registrations in structured format
The system SHALL store completed registration data in a structured, machine-readable format (e.g., JSON).
#### Scenario: Registration saved
- **WHEN** a registration is completed
- **THEN** all collected data SHALL be stored in a structured format with consistent field names
#### Scenario: Data structure consistency
- **WHEN** multiple registrations are stored
- **THEN** all records SHALL follow the same schema structure
### Requirement: Registration schema validation
The system SHALL validate registration data against a defined schema before storage.
#### Scenario: Valid registration stored
- **WHEN** a registration with all required fields is submitted
- **THEN** the system SHALL validate and store the registration
#### Scenario: Invalid registration rejected
- **WHEN** a registration with missing or invalid fields is submitted for storage
- **THEN** the system SHALL reject the storage and report the validation errors
### Requirement: Registration data is exportable
The system SHALL allow export of registration data in common formats for further processing.
#### Scenario: Export to CSV
- **WHEN** the admin requests a CSV export
- **THEN** the system SHALL generate a CSV file with all registration records
#### Scenario: Export to JSON
- **WHEN** the admin requests a JSON export
- **THEN** the system SHALL provide registration data in JSON format
### Requirement: Registration records are queryable
The system SHALL allow querying registrations by common criteria.
#### Scenario: Query by date range
- **WHEN** the admin queries registrations within a date range
- **THEN** the system SHALL return matching registration records
#### Scenario: Query by booking day
- **WHEN** the admin queries registrations for a specific booking day
- **THEN** the system SHALL return registrations that include that day
### Requirement: Registration data includes metadata
The system SHALL store metadata alongside registration data including submission timestamp and source channel.
#### Scenario: Timestamp recorded
- **WHEN** a registration is completed
- **THEN** the record SHALL include the submission date and time
#### Scenario: Channel recorded
- **WHEN** a registration is completed via email or chat
- **THEN** the record SHALL indicate which channel was used
@@ -0,0 +1,41 @@
## ADDED Requirements
### Requirement: Notify admin on completed registration
The system SHALL send an email notification to the admin when a new registration is completed.
#### Scenario: Notification sent
- **WHEN** a parent completes a registration
- **THEN** the admin SHALL receive an email notification
#### Scenario: Notification timing
- **WHEN** a registration is completed
- **THEN** the notification SHALL be sent promptly (within minutes)
### Requirement: Notification contains registration summary
The system SHALL include a summary of the registration in the notification email.
#### Scenario: Summary content
- **WHEN** a notification email is sent
- **THEN** it SHALL include child name, parent contact, requested booking days, and any special needs noted
#### Scenario: Notification links to full record
- **WHEN** the admin views the notification email
- **THEN** it SHALL indicate how to access the full registration record
### Requirement: Notification identifies source channel
The system SHALL indicate in the notification which channel the registration came through.
#### Scenario: Email registration notification
- **WHEN** a registration completed via email triggers a notification
- **THEN** the notification SHALL indicate the registration came via email
#### Scenario: Chat registration notification
- **WHEN** a registration completed via chat triggers a notification
- **THEN** the notification SHALL indicate the registration came via chat
### Requirement: Admin can configure notification preferences
The system SHALL allow the admin to configure notification email address.
#### Scenario: Update notification email
- **WHEN** the admin changes the notification email address
- **THEN** subsequent notifications SHALL be sent to the new address
@@ -0,0 +1,41 @@
## ADDED Requirements
### Requirement: Knowledge base stores service information
The system SHALL maintain a knowledge base containing playgroup service information including fees, regulations, opening hours, policies, and frequently asked questions.
#### Scenario: Knowledge base content categories
- **WHEN** the knowledge base is queried
- **THEN** it SHALL be able to provide information about fees, regulations, opening hours, policies, and FAQs
### Requirement: Agent accesses knowledge base to answer questions
The system SHALL enable the AI agent to query the knowledge base and provide accurate answers to parent questions.
#### Scenario: Parent asks about fees
- **WHEN** a parent asks about service fees or pricing
- **THEN** the agent SHALL retrieve current fee information from the knowledge base and respond accurately
#### Scenario: Parent asks about regulations
- **WHEN** a parent asks about playgroup rules or regulations
- **THEN** the agent SHALL retrieve the relevant policies and explain them clearly
#### Scenario: Unknown question
- **WHEN** a parent asks a question not covered in the knowledge base
- **THEN** the agent SHALL indicate it cannot answer and suggest contacting the admin directly
### Requirement: Knowledge base is admin-maintainable
The system SHALL allow the admin to update knowledge base content without requiring technical skills or code changes.
#### Scenario: Admin updates fee information
- **WHEN** the admin edits the fee information in the knowledge base
- **THEN** the agent SHALL use the updated information in subsequent responses
#### Scenario: Admin adds new FAQ entry
- **WHEN** the admin adds a new FAQ entry to the knowledge base
- **THEN** the agent SHALL be able to answer questions related to that entry
### Requirement: Knowledge base uses simple editable format
The system SHALL store knowledge base content in a human-readable format (e.g., markdown or structured text files).
#### Scenario: Knowledge base file format
- **WHEN** the admin views the knowledge base files
- **THEN** the content SHALL be readable and editable without specialized tools
@@ -0,0 +1,47 @@
## 1. Define Registration Data Requirements
- [x] 1.1 Document all required registration fields (child name, DOB/age, parent contact, booking days, special needs)
- [x] 1.2 Document optional registration fields and when to collect them
- [x] 1.3 Define validation rules for each field (formats, constraints, allowed values)
- [x] 1.4 Create registration data schema (JSON schema or equivalent)
## 2. Prepare Knowledge Base Content
- [x] 2.1 Compile current service fee information (rates, payment terms, discounts)
- [x] 2.2 Document playgroup regulations and policies
- [x] 2.3 Document opening hours and booking availability
- [x] 2.4 Compile frequently asked questions and answers
- [x] 2.5 Organize knowledge base content into structured markdown files
## 3. Define Conversation Flows
- [x] 3.1 Map out the registration conversation flow (question sequence, branches)
- [x] 3.2 Define agent personality and tone guidelines
- [x] 3.3 Write sample agent responses for common scenarios
- [x] 3.4 Define how agent handles mixed intent (registration + questions)
- [x] 3.5 Define conversation timeout and resumption behavior
## 4. Define Notification Requirements
- [x] 4.1 Design notification email template content
- [x] 4.2 Define which registration fields appear in notification summary
- [x] 4.3 Specify admin notification email address(es)
## 5. Define Data Export Requirements
- [x] 5.1 Define required export formats (CSV columns, JSON structure)
- [x] 5.2 Document how exports integrate with existing admin workflow
- [x] 5.3 Define any filtering or query requirements for exports
## 6. Channel-Specific Requirements
- [x] 6.1 Define email address for registration channel
- [x] 6.2 Define chat interface branding requirements (logo, colors, welcome message)
- [x] 6.3 Document any channel-specific behavior differences
## 7. Review and Finalize Scope
- [x] 7.1 Review all documented requirements with stakeholders
- [x] 7.2 Identify any gaps or missing requirements
- [x] 7.3 Prioritize features for initial release vs. future iterations
- [x] 7.4 Finalize and approve project scope documentation
+20
View File
@@ -0,0 +1,20 @@
schema: spec-driven
# Project context (optional)
# This is shown to AI when creating artifacts.
# Add your tech stack, conventions, style guides, domain knowledge, etc.
# Example:
# context: |
# Tech stack: TypeScript, React, Node.js
# We use conventional commits
# Domain: e-commerce platform
# Per-artifact rules (optional)
# Add custom rules for specific artifacts.
# Example:
# rules:
# proposal:
# - Keep proposals under 500 words
# - Always include a "Non-goals" section
# tasks:
# - Break tasks into chunks of max 2 hours