docs/novaberg-pattern-domain-language.md
Rama master · réplica de lectura del repositorio original.
# Novaberg — Pattern: Domain-Language-Normalisierung
**Projekt:** Novaberg — The Nova Anima Resonance System
**Dokument:** Pattern — Normalisierung von User-Input durch agenten-spezifische Fachsprache
**Stand:** 17. April 2026, Chat 52 (Code-Alignment)
**Pfad:** `novaberg/docs/novaberg-pattern-domain-language.md`
**Quellen:** nova-15-k.md (allgemeine Abschnitte)
---
## 1. Problem
Novas interne Verarbeitungskette arbeitet auf Rohdaten — dem unveraenderten User-Prompt. Slang, Emotion und Absicht muessen von jedem Node eigenstaendig interpretiert werden:
- CRUD bekommt mehrdeutige Anweisungen und muss raten
- Verb-Mappings fangen Dialekt ab, aber nicht Kontextabhaengigkeit
- LLM-Klassifikation kann durch emotionale Sprache beeinflusst werden
- Verifikation prueft gegen einen Zustand, den sie nur aus dem Rohtext ableiten kann
**Industrielle Analogie:** Produktionsdaten von externen Lieferanten im Rohformat. Wenn diese ungeprueft in die Produktion fliessen, entstehen unerwartete Fehler. Loesung: Eingangspruefung, Normalisierung, Validierung — erst dann Produktion.
---
## 2. Leitprinzip
> **Rohdaten vollstaendig erhalten, intern nur auf validierten Daten arbeiten.**
| Prinzip | Etabliert | Aussage |
|---------|-----------|---------|
| Daten vollstaendig transportieren | Chat 30 | Keine Middleware darf Daten reduzieren |
| Weniger Input > staerkerer Prompt | Chat 23 | Halluzinationen durch Kontextreduktion loesen |
| **Rohdaten erhalten, validiert verarbeiten** | **Chat 43** | **Interne Prozesse arbeiten auf normalisierter Fachsprache** |
Kein Widerspruch: Die Rohdaten (Emotion, Energie, Slang, Originaltext) bleiben vollstaendig im State fuer den Responder. Aber die Verarbeitungskette (CRUD, Verifikation) arbeitet auf bereinigter, fachsprachlicher Repraesentation.
---
## 3. Zwei Schichten im State
| Schicht | Inhalt | Konsumenten |
|---------|--------|-------------|
| **Rohdaten** | `user_prompt`, Emotion, Arousal, Energie, Slang, Session-Turns | Responder, Salienz, EI, Gespraechsvektor |
| **Validierte Daten** | `normalisiert`, action, target, Domain Language | CRUD, Verifikation, Verb-Mappings, Logging |
Die Trennung ist strikt: Kein CRUD-Code liest `user_prompt` direkt. Kein Responder-Code liest `normalisiert` fuer die Antwortgenerierung.
---
## 4. Architektur — Normalisierung im Classify-Node
### Warum der Classify-Node?
Der Classify-Node macht bereits einen GPU-LLM-Call fuer die Aktionsklassifikation. Die Normalisierung ist ein zusaetzliches Output-Feld — kein Extra-Call, keine zusaetzliche Latenz.
| Alternative | Problem |
|-------------|---------|
| Eigener Node vor dem Router | Extra-LLM-Call auf jedem Turn, auch Smalltalk |
| Im Router | Sekretaerin muesste Fachsprache aller Abteilungen kennen |
| In der Perzeption | Ueberlaestet den Perzeption-Call, falsche Zustaendigkeit |
| **Im Classify-Node** | **Kostenlos: LLM-Call existiert bereits, Domain Language ist lokal** |
### Sekretaerin / Empfang / Sachbearbeiter — Metapher
- **Sekretaerin (Router):** Empfaengt den Kunden, entscheidet welche Fachabteilung zustaendig ist. Diagnostiziert nicht.
- **Empfang der Fachabteilung (Classify-Node):** Nimmt den Kunden auf, fuellt das interne Formular aus — in der Fachsprache der Abteilung.
- **Sachbearbeiter (CRUD):** Arbeitet ausschliesslich mit dem ausgefuellten Formular. Sieht den Kunden nicht direkt.
### Classify-Output (erweitert)
```json
{
"action": "update",
"target": "Einkaufsliste",
"target_typ": "inhalt",
"konfidenz": "hoch",
"normalisiert": "remove_content: Bananen von Notiz 'Einkaufsliste' entfernen"
}
```
Die CRUD liest `normalisiert` statt `aufgabe` (den rohen User-Prompt).
---
## 5. Dreiphasenmodell
### Phase 1: Eingabe (verstehen)
- Aufnahme des rohen User-Prompts
- Perzeption: Emotion, Arousal, Intent, Modus, Stil, Beziehungsdynamik
- Router: Fachabteilung bestimmen
- Ergebnis: Alle Dimensionen gemessen, Rohdaten vollstaendig im State
### Phase 2: Verarbeitung (handeln)
- Classify: Normalisierung in Domain Language, Aktionsklassifikation
- CRUD: Arbeitet auf normalisierten, bekannten, berechenbaren Werten
- Verifikation: Prueft gegen erwarteten Zustand
- Ergebnis: Fehleranfaelligkeit niedrig, deterministische Pfade wo moeglich
### Phase 3: Ausgabe (antworten)
- Responder: Arbeitet mit Originaltext, Emotionen, Energie, Stil
- Gespraechsvektor: Richtung und Laenge aus EI-Dimensionen
- Charakter: Ton, Persoenlichkeit, Beziehungsdynamik
- Ergebnis: Antwort spiegelt die volle emotionale Bandbreite des Users
---
## 6. [FACHSPRACHE]-Block
Jeder Agent definiert sein Fachvokabular als Domain Language. Der Classify-Prompt baut daraus einen `[FACHSPRACHE]`-Block:
### Format (generisch)
Seit der Prompt-Segregation (Chat 46–47) liegt der `[FACHSPRACHE]`-Block pro Agent als eigene Datei unter `prompts/default/`:
- `classify_notizen.fachsprache.txt`
- `classify_timeline.fachsprache.txt`
- `classify_direktiven.fachsprache.txt`
- `classify_charakter.fachsprache.txt`
Der Classify-Node baut den Prompt aus vier Bausteinen zusammen: `{agent}.identity` + `{agent}.task` + `{agent}.fachsprache` + `{agent}.rules`.
Vor der Segregation waren die Domain-Language-Daten als Python-Dict im Classify-Modul definiert — die Struktur war:
```python
DOMAIN_LANGUAGE = {
"aktionen": {
"create": "Neuen Eintrag anlegen",
"read": "Bestehenden Eintrag anzeigen",
"update": "Bestehenden Eintrag inhaltlich aendern",
"delete": "Eintrag deaktivieren (Soft-Delete)",
# ... weitere agent-spezifische Aktionen
},
"entitaeten": ["Notiz", "Liste", "Merkzettel", "Entwurf"],
"format": "{action}: {beschreibung} (betrifft {entitaet} '{name}')",
}
```
### Vokabular-Pattern
Jede Aktion bekommt eine klare Fachsprache-Definition. Das LLM uebersetzt den Rohtext in dieses Vokabular:
| User sagt | Normalisiert |
|-----------|-------------|
| "Hau die Scheisse raus" | "remove_content: Bananen von Notiz 'Einkaufsliste' entfernen" |
| "Schmeiss noch Milch drauf" | "add_content: Milch zu Notiz 'Einkaufsliste' hinzufuegen" |
| "Nenn mich ab jetzt Boss" | "update: Anrede des Nutzers auf 'Boss' aendern" |
| "Hau mir Montag nen Zahnarzt rein" | "create: Termin 'Zahnarzt' am Montag anlegen" |
Dasselbe Prinzip wie der `[ERKENNUNGSHILFE]`-Block aus der CRUD-Haertung — erweitert um die Normalisierungsanweisung.
---
## 7. Abgrenzungen
### Was die Normalisierung NICHT ist
- **Keine Zensur.** Emotionen und Slang werden nicht unterdrueckt — sie bleiben im `user_prompt` fuer den Responder.
- **Keine Vereinfachung.** Der volle Kontext bleibt erhalten; die Normalisierung ist eine parallele Repraesentation, kein Ersatz.
- **Kein Parsing.** Es ist kein regelbasierter Parser, sondern eine LLM-basierte Uebersetzung im bestehenden Classify-Call.
- **Kein Extra-LLM-Call.** Sie ist ein Feld im bestehenden Classify-Output.
- **Kein Ersatz fuer Verb-Mappings.** Verb-Mappings sind deterministisch und user-spezifisch. Normalisierung ist LLM-basiert und agenten-spezifisch. Beide ergaenzen sich.
### Was die Normalisierung IST
- Eine Uebersetzung von natuerlicher Sprache in die Fachsprache des zustaendigen Agenten
- Ein Formular, das der Empfang der Fachabteilung ausfuellt
- Eine Qualitaetssicherungsmassnahme fuer die interne Verarbeitungskette
---
## 8. Verb-Mappings Rollenverschiebung (Chat 44)
Mit der Einfuehrung der Domain Language verschiebt sich die Rolle von Keywords und Verb-Mappings:
| Aspekt | Vorher (Chat 42) | Nachher (Chat 44) |
|--------|-------------------|-------------------|
| Primaere Erkennung | Keywords + Verb-Mappings + LLM | Domain Language ([FACHSPRACHE]-Block) |
| Sekundaere Pruefung | — | Keywords + Verb-Mappings (Konfidenz-Anker) |
| Lern-Schwellwert | 3 (keine Rueckfrage ab Konfidenz >=3) | Unveraendert |
| Funktion | "Was meint der User?" (Verstaendnis) | "Stimmt das LLM mit deterministischer Pruefung ueberein?" (Vertrauen) |
Die `[ERKENNUNGSHILFE]` liefert weiterhin Hints an den Classify, aber die Domain Language im `[FACHSPRACHE]`-Block ist jetzt die primaere Quelle fuer das Verstaendnis umgangssprachlicher Ausdruecke.
---
## 9. Bezug zu bestehenden Konzepten
| Konzept | Bezug |
|---------|-------|
| CRUD-Haertung (nova-14-k) | Normalisierung staerkt Phase 1 (ERKENNEN) und Phase 2 (VALIDIEREN) |
| Dreistufige Erkennung | Keywords + Verb-Mappings liefern [ERKENNUNGSHILFE], Classify nutzt sie + normalisiert |
| Strukturierte Kontextualisierung | Domain Language ist strukturierte Kontextualisierung fuer den Classify-Prompt |
| Daten vollstaendig transportieren | Normalisierung ergaenzt, ersetzt nicht — Rohdaten bleiben erhalten |
---
## 10. Status
Implementiert fuer 4 von 6 Agenten:
| Agent | Chat | Status |
|-------|------|--------|
| NotizenAgent | Chat 43 | Implementiert |
| DirektivenAgent | Chat 44 | Implementiert |
| CharakterIdentitaetAgent | Chat 44 | Implementiert |
| TimelineAgent | Chat 44 | Implementiert |
| FaktenAgent | — | Offen (laeuft ueber Salienz-Pipeline, braucht vermutlich keine Normalisierung) |
| DateienAgent | — | Offen (neuer Agent, geplant) |
**Fallback:** Wenn der Classify das `normalisiert`-Feld nicht oder fehlerhaft liefert, faellt CRUD auf `user_prompt` zurueck — keine Regression.