Ctrl K
ComunidadGuías…

docs/novaberg-pattern-domain-language.md

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# 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.