Files

302 lines
13 KiB
Markdown
Raw Permalink Normal View History

# CLAUDE.md — Meister-Eder
This file provides context for AI assistants working in this repository.
## Project Overview
**Meister-Eder** is an AI-powered conversational registration system for **Spielgruppe Pumuckl**, a playgroup run by Familienverein Fällanden (Fällanden, Switzerland). It replaces a static Google Forms workflow with an AI agent that guides parents through child registration via natural conversation.
**Current state**: Greenfield project — no application code exists yet. All work to date is specification and scoping documentation.
**Primary stakeholders**:
- Playgroup admin (Markus Graf, Andrea Sigrist, Barbara Gross) — receives registrations, maintains knowledge base
- Parents — interact with the agent to register their child and ask questions
---
## Repository Structure
```
Meister-Eder/
├── README.md # Minimal placeholder
├── CLAUDE.md # This file
├── LICENSE
├── openspec/
│ ├── config.yaml # OpenSpec schema config (spec-driven)
│ └── changes/
│ └── define-project-scope/ # Completed scoping change (all tasks done)
│ ├── .openspec.yaml # Change metadata
│ ├── proposal.md # Why/What/Capabilities
│ ├── design.md # Architecture decisions, risks, open questions
│ ├── tasks.md # Implementation task breakdown (all checked)
│ ├── specs/ # Formal capability specifications
│ │ ├── conversational-registration/spec.md
│ │ ├── chat-interface/spec.md
│ │ ├── email-channel/spec.md
│ │ ├── registration-data-store/spec.md
│ │ ├── registration-notifications/spec.md
│ │ └── service-knowledge-base/spec.md
│ └── content/ # Reference content and domain data
│ ├── agent-personality.md
│ ├── channel-config.md
│ ├── conversation-flow.md
│ ├── export-formats.md
│ ├── notification-template.md
│ ├── registration-fields.md
│ ├── registration-schema.json
│ ├── release-priorities.md
│ ├── sample-responses.md
│ ├── validation-rules.md
│ └── knowledge-base/
│ ├── README.md
│ ├── faq.md
│ ├── fees.md
│ ├── regulations.md
│ ├── schedule.md
│ ├── Reglement-Spielgruppe-2024.pdf
│ └── Tarifliste-Spielgruppe-2024_2025.pdf
├── .claude/
│ ├── commands/opsx/ # Claude Code slash commands for OpenSpec workflow
│ └── skills/ # Claude skill implementations
└── .gemini/
├── commands/opsx/ # Gemini CLI commands for OpenSpec workflow
└── skills/ # Gemini skill implementations
```
---
## Development Workflow (OpenSpec)
This project uses the **OpenSpec spec-driven workflow**. Changes are structured as artifacts before implementation begins.
### Key Commands (Claude Code)
| Command | Purpose |
|---------|---------|
| `/opsx:new` | Start a new change (creates proposal → design → specs → tasks) |
| `/opsx:continue` | Create the next artifact in the workflow |
| `/opsx:ff` | Fast-forward: create all artifacts at once |
| `/opsx:apply` | Implement tasks from a change |
| `/opsx:verify` | Verify implementation matches specs |
| `/opsx:archive` | Archive a completed change |
| `/opsx:explore` | Explore/research mode before committing to a change |
### Artifact Sequence (spec-driven schema)
1. **proposal.md** — Why/what/capabilities (non-technical)
2. **design.md** — Architecture decisions, risks, goals/non-goals
3. **specs/** — Formal `ADDED/MODIFIED/REMOVED` requirements per capability
4. **tasks.md** — Checklist of implementation tasks
5. Archive after implementation is verified
### Changes Directory
Each change lives in `openspec/changes/<change-name>/`. The only current change is `define-project-scope` (status: **all tasks complete**).
---
## System Architecture (Designed, Not Yet Built)
### Core Design Decisions
1. **Channel-agnostic core agent** with adapter layer — the conversation logic is separate from channel-specific handling (email vs. chat). This enables adding Telegram/WhatsApp later without touching the core.
2. **LLM + structured schema** — LLM handles natural language; a structured JSON schema validates all required fields before submission. Pure LLM was rejected (risk of missing fields); pure rule-based was rejected (too rigid).
3. **Knowledge base as editable files** — Service info (fees, regulations, FAQs) stored as markdown files that admins can update without code changes.
4. **Structured JSON storage** — Completed registrations stored as JSON records validated against a schema. CSV/JSON export for Google Sheets compatibility.
5. **Email state via thread tracking** — Email conversations maintained via `In-Reply-To`/`References` headers. No timeout (async by nature); 1-month retention for incomplete registrations.
### Capabilities
| Capability | Description |
|------------|-------------|
| `conversational-registration` | AI agent guides parents through registration one question at a time |
| `service-knowledge-base` | Markdown files the agent queries to answer questions about fees, schedule, policies |
| `email-channel` | Email-based conversation; thread-tracked state; async |
| `chat-interface` | Web-based real-time chat; mobile-responsive; session-based state |
| `registration-data-store` | Structured JSON storage with schema validation; CSV/JSON export |
| `registration-notifications` | Email notifications to admin on completion; routed by playgroup type |
---
## Domain Knowledge
### Playgroup Details
**Organization**: Familienverein Fällanden
**Playgroup name**: Spielgruppe Pumuckl
**Location**: Sunnetalstrasse 4, 8117 Fällanden, Switzerland
**Indoor Playgroup** (Innenspielgruppe)
- Days: Monday, Wednesday, Thursday — 9:0011:30
- Age: 2.5+ years
- Group size: 811 children
- Leaders: Andrea Sigrist (079 674 99 92, andrea.sigrist@gmx.net) & Kübra Karatas
**Outdoor Forest Playgroup** (Waldspielgruppe)
- Days: Monday — 9:0014:00 (includes snack & lunch)
- Age: 3+ years
- Group size: max 10 children
- Leader: Barbara Gross (078 761 19 64, baba.laeubli@gmail.com)
**Administration**: Markus Graf (079 261 16 37, spielgruppen@familien-verein.ch)
### Fees (2024/2025)
| Playgroup | Frequency | Monthly Fee |
|-----------|-----------|-------------|
| Indoor | 1x/week | CHF 130 |
| Indoor | 2x/week | CHF 260 |
| Indoor | 3x/week | CHF 390 |
| Outdoor | 1x/week (Mon only) | CHF 250 |
- One-time registration fee: CHF 80 (first year); CHF 80 craft materials from second year
- Indoor only: CHF 50 refundable cleaning deposit
- Sibling discount: 10% per additional child
- July and August: fee-free
### Registration Schema
All fields are required (13 total):
```json
{
"child": {
"fullName": "string (min 2 chars)",
"dateOfBirth": "YYYY-MM-DD",
"specialNeeds": "string or 'None'"
},
"parentGuardian": {
"fullName": "string",
"streetAddress": "string",
"postalCode": "4-digit Swiss code",
"city": "string",
"phone": "string",
"email": "valid email"
},
"emergencyContact": {
"fullName": "string",
"phone": "string"
},
"booking": {
"playgroupTypes": ["indoor" | "outdoor"],
"selectedDays": [{"day": "monday|wednesday|thursday", "type": "indoor|outdoor"}]
},
"metadata": {
"submittedAt": "ISO 8601",
"channel": "email | chat",
"conversationId": "string (optional)"
}
}
```
**Booking constraints**:
- Indoor: Monday, Wednesday, or Thursday
- Outdoor: Monday only
- Children can register for one, both, or any day combination
**Age validation**: 25 years at time of registration
### Conversation Flow
```
1. Greeting & intent detection
2. Child information (name → DOB → age validation)
3. Playgroup selection (type → days)
4. Special needs
5. Parent/guardian contact (name, address, phone, email)
6. Emergency contact (name, phone)
7. Confirmation summary → corrections if needed
8. Completion (fee summary, contact info)
```
At any point, parents can ask questions — agent answers from knowledge base, then returns to registration.
### Language
- **Default language: German** (informal "du", Swiss context)
- Detect parent's language automatically; respond consistently in same language
- Both German and English fully supported
### Admin Notification Routing
| Registration type | Notification recipients |
|-------------------|------------------------|
| Indoor only | Andrea Sigrist + CC: Markus Graf |
| Outdoor only | Barbara Gross + CC: Markus Graf |
| Both | Andrea Sigrist + Barbara Gross + CC: Markus Graf |
### Email Channel State
- **Incomplete registration retention**: 1 month
- **Reminder schedule**: Day 3, Day 10, Day 25 (max 3 reminders)
- **Day 30**: Data cleared (no email sent)
### Chat Channel State
- Session-based (browser session); no server-side persistence for incomplete registrations
- For longer breaks, email channel is recommended
---
## Data Export
### CSV format
Filename: `registrations_YYYY-MM-DD.csv` (UTF-8, comma-separated)
Columns: `registration_id`, `submitted_at`, `channel`, `child_name`, `child_dob`, `child_age_years`, `child_age_months`, `special_needs`, `playgroup_types`, `selected_days`, `monthly_fee`, `parent_name`, `parent_address`, `parent_postal_code`, `parent_city`, `parent_phone`, `parent_email`, `emergency_name`, `emergency_phone`
### JSON format
Bulk export wraps records in `{ exportedAt, totalRecords, filters, registrations: [...] }`.
### Export filters
Date range, playgroup type (indoor/outdoor), booking day, channel — combinable.
---
## MVP Release Priorities
All of the following are **must-have** for initial release:
- Chat interface (web, mobile-responsive)
- Email channel (full conversation support)
- Conversational registration (guided AI collection)
- Knowledge base Q&A
- Bilingual support (German + English)
- Registration data storage (structured JSON)
- Admin notifications (routed by playgroup type)
- Email reminders for incomplete registrations (Day 3/10/25)
- Data export (CSV + JSON)
**Out of scope**: Payment processing, calendar integration, parent accounts, mobile app, Telegram/WhatsApp (Phase 2).
---
## Conventions for AI Assistants
1. **No code exists yet.** The scoping phase is complete. The next step is implementation planning and then building.
2. **Read specs before implementing.** All capability specifications are in `openspec/changes/define-project-scope/specs/`. Implement to these requirements.
3. **Domain content is in `content/`.** Agent personality, sample responses, conversation flow, and all knowledge base content is pre-written. Use it — don't invent new fee amounts, contact info, or policies.
4. **Tech stack is undecided.** The design documents deliberately leave the tech stack open. When implementing, choose based on the constraints: the system needs LLM access, email send/receive, a web server, and file-based storage. Document your choices in `openspec/config.yaml`'s context field.
5. **Use OpenSpec workflow for new changes.** Don't add features or refactor without creating a proper change via `/opsx:new`. This ensures all work is spec'd before implementation.
6. **Agent tone is warm and friendly.** Refer to `content/agent-personality.md` for tone guidelines and `content/sample-responses.md` for example responses. The agent should feel like a helpful staff member, not an automated system.
7. **Bilingual by default.** All agent-facing output (messages, responses) must support both German and English. German is the default.
8. **Schema validation is non-negotiable.** Every completed registration must pass JSON schema validation before storage and notification. Incomplete registrations must never trigger admin notifications.
9. **Channel-agnostic core.** Business logic (conversation, validation, storage, notification) must not contain channel-specific code. Channel adapters translate to/from a common message format.
10. **Knowledge base files are admin-editable.** Keep knowledge base content in simple markdown files that a non-technical admin can edit. Never hardcode fee amounts or policy text in application code.