# Claude-Code-Prompt: Voice-Agent-Backend (PoC)

Du baust das Agenten-Backend fuer eine iOS-Voice-App fuer den Aussendienst.
**Lies zuerst `CLAUDE.md` im Repo-Root** und die vier Daten-Fixtures unter `data/` vollstaendig,
bevor du irgendetwas planst. Halte dich strikt an die dortigen Regeln (IDs nie erfinden,
Bearbeiter-Aufloesung ohne inaktive Benutzer, kein CRM-Write-back, Hybrid-Voice-Ansatz).

## Kontext in einem Satz
Pro Kundenbesuch: (1) Vorbereitung per Sprache aus `preparation.json`, (2) Dokumentations-Gespraech
das ein `transcript.json` erzeugt, (3) deterministische Extraktion die ein freigabepflichtiges
`report.json` erzeugt. Zielsystem CAS genesisWorld (GGUID/Hex). PoC endet beim freigegebenen Bericht.

## Tech-Rahmen
- pnpm-Turborepo (bestehend), TypeScript.
- LiveKit Agents (Node-SDK) fuer die Voice-Ebene, xAI Grok Voice ueber das LiveKit-Plugin.
- Zod fuer alle Schemas. Daten unter `DATA_DIR` (Default `./data`).
- **Bevor du Versionen/APIs festnagelst: pruefe die aktuelle LiveKit-Agents-Node- und xAI-Grok-Voice-Doku**
  und pinne konkrete Versionen. Nichts aus dem Gedaechtnis raten.

## Zielstruktur (Vorschlag, im Plan bestaetigen)
```
packages/
  schemas/        # Zod-Schemas + TS-Typen fuer die 4 Artefakte (shared)
  agent/          # LiveKit Voice-Agent + Extraktions-Pipeline (Node/TS)
data/             # Fixtures (bereits vorhanden)
```

## Vorgehen – arbeite in Phasen, HALTE nach jeder Phase an

### Phase 0 – Plan (HOLD)
Lege einen kurzen Plan vor: Package-Struktur, gepinnte Versionen (LiveKit Agents Node, xAI/Grok-Voice-Plugin, Zod),
Datenfluss der drei Flows, und wie du die Voice-Ebene erst zuletzt anbindest. **Stopp, warte auf Freigabe.**

### Phase 1 – `packages/schemas` (HOLD)
- Zod-Schemas fuer alle vier Artefakte, **Keys exakt wie in den JSON-Fixtures** (Deutsch, CAS-nah).
- Enums fuer `delta`, `bearbeiter_typ`, `bearbeiter_aufloesung`, `status`, Naechste-Schritte-`typ`.
- Ableitung der TS-Typen aus Zod. Ein `CLAUDE.md` im Package.
- Test: alle vier mitgelieferten Fixtures validieren erfolgreich gegen ihr Schema.
- Ein Commit. **Stopp.**

### Phase 2 – Extraktions-Pipeline, TEXT-ONLY (HOLD)  ← wichtigster PoC-Beweis
Kein Mikrofon, kein Voice. Reine Funktion:
`extract(preparation.json, transcript.json, benutzer.json) -> report.json`.
- **Supervisor** routet Transkript-Inhalte an Spezialisten, jeder mit striktem Output-Schema:
  `aufgaben`, `verkaufschancen`, `kundenanfragen`, `naechste_schritte`.
- **Bearbeiter-Resolver**: Name/Alias -> genau eine `gguid` aus `benutzer.json`; `aktiv:false` ausschliessen;
  Ergebnis als `bearbeiter_aufloesung` (`eindeutig|mehrdeutig|nicht_gefunden|rolle`); bei reiner Rolle `abteilungs_defaults`.
- **Coverage-Checker**: offene Agenda-Items aus `preparation.json`, die im Transkript nicht adressiert wurden -> `offen_geblieben`.
- Bestehende Objekte behalten GGUID; neue bekommen `temp_id`; `abgeleitet_aus_gespraech` korrekt setzen.
- Output mit Zod validieren.
- **Akzeptanzkriterien** (gegen die mitgelieferten Fixtures pruefen):
  1. Ergebnis validiert gegen das report-Schema.
  2. Petra Muellers GGUID wird der Marketing-Aufgabe zugewiesen; Sandra Koch (inaktiv) taucht nie als Bearbeiter auf.
  3. Die Sonderprofile-Anfrage landet in `offen_geblieben`.
  4. `naechste_schritte` enthalten den Innendienst-Punkt (verknuepft zur neuen Aufgabe) und mindestens einen strategischen Punkt.
  5. Das Ergebnis ist inhaltlich konsistent mit `report.json` (Golden-Referenz) – Abweichungen begruenden.
- Ein Commit. **Stopp.**

### Phase 3 – Voice-Ebene (HOLD)
- LiveKit-Room + Token-Server (Endpunkt fuer die iOS-App).
- **Vorbereitungs-Flow**: Agent liest ein aus `preparation.json` erzeugtes Briefing vor (TTS) und beantwortet Rueckfragen
  – gegroundet ausschliesslich in `preparation.json`.
- **Dokumentations-Flow**: Grok-Voice-Dialog auf Deutsch, gefuehrt von der Agenda (offene Items),
  fragt gezielt nach Nicht-Besprochenem, erkennt Bearbeiter-Nennungen; schreibt am Ende `transcript.json`.
- Nach dem Gespraech laeuft die Extraktion aus Phase 2.
- Ein Commit. **Stopp.**

### Phase 4 – Freigabe-Schnittstelle
- Stelle `report.json` textlich bereit und biete eine **Freigabe-Aktion**, die `status: freigegeben` + `freigabe` setzt
  (das ruft spaeter die iOS-App auf). **Kein** CRM-Write-back.
- Ein Commit.

## Nicht tun
- Keine erfundenen GGUIDs. Keine Zuweisung an inaktive Benutzer. Kein Write-back ins CRM.
- Extraktion niemals im Realtime-Voice-Loop – immer der separate Text-Schritt.
- Keine Voice-Arbeit vor Phase 3 (Phase 2 muss erst stehen).
