docs/novaberg-ei_l.md
Rama master · réplica de lectura del repositorio original.
# 02_L_f — Lesson: Der Blindflug
**Projekt:** Novaberg — The Nova Anima Resonance System
**Dokument:** Lesson — Emotionale Intelligenz ohne Sichtbarkeit
**Stand:** 12. April 2026, Chat 44 (migriert, Inhalt unverändert)
**Pfad:** novaberg/docs/novaberg-ei_l.md
**Ursprung:** nova-02-l-f.md
**Typ:** Lesson (L)
**Entdeckt:** Chat 15 (Testlauf "Karrierekrise"), bestätigt Chat 16 (Standard-Routing-Test)
**Betrifft:** API-Response, Session-Annotation, Test-Infrastruktur
---
## 1. Symptom
`emotions_vektor` war bei 200/200 Testlauf-Prompts und 10/10 Standard-Test-Prompts ein leerer String. Die gesamte emotionale Intelligenz — 9 Vektoren, logarithmischer Decay, Arousal-Steuerung — lief intern korrekt, war aber nach außen unsichtbar.
Der Responder wurde korrekt gesteuert (Arousal beeinflusste Antwortlänge, Vektor beeinflusste Ton), aber weder Client noch Test-Runner konnten das verifizieren.
---
## 2. Ursache: Zwei getrennte Lücken
**Lücke 1 — Session-Annotation:** `session_turn_annotate` hatte keinen Parameter `emotions_vektor`. Der Enricher berechnete den Vektor, der Responder nutzte ihn im Prompt, die Salienz schrieb ihn nicht in den Session-Turn. Ein vergessener Parameter bei einer Funktions-Erweiterung.
**Lücke 2 — API-Response:** `GespraechAntwort` hatte nur drei Felder: `antwort`, `modell`, `token_total`. Alle EI- und Routing-Daten (Emotion, Arousal, Vektor, Verlauf, Intent, Momentum, ...) existierten im State, wurden aber am Ausgang verworfen. Der Test-Runner behalf sich mit einem Umweg über den Session-Endpoint — der die Daten auch nicht hatte (wegen Lücke 1).
---
## 3. Lösung
**Lücke 1:** `emotions_vektor` als Parameter an `session_turn_annotate` + Übergabe in `salience.py`.
**Lücke 2:** `GespraechAntwort` um 12 Felder erweitert (emotion, arousal, emotions_vektor, emotions_verlauf, sprach_stil, beziehungs_dynamik, intent, tone, gespraechs_modus, user_intentionen, momentum, needs_web). Synchroner + SSE-Endpoint geben die Daten aus dem State zurück. Test-Runner liest direkt aus der Response.
---
## 4. Generalisierbare Erkenntnis
> **Interne Korrektheit ≠ Sichtbarkeit.** Ein System kann intern perfekt funktionieren und trotzdem für Debugging, Testing und Client-Darstellung blind sein. Die API-Response ist nicht nur für den Endbenutzer — sie ist das Fenster, durch das Test-Infrastruktur und Entwickler das System beobachten.
> **Testen was man nicht sieht ist unmöglich.** Der 200-Prompt-Testlauf (Chat 15) konnte BUG1 entdecken, aber nicht diagnostizieren — weil der Verlauf nicht sichtbar war. Erst mit den 12 Response-Feldern wurde der emotionale Bogen (stress → stabilisierung → hoffnung → zufriedenheit, mit Decay-Gewichten) überprüfbar.
> **Response-Design ist Test-Design.** Wenn die API-Response nur das Minimum enthält, kann der Test-Runner nur das Minimum prüfen. Jedes interne Signal, das für die Qualitätsbewertung relevant ist, muss in der Response stehen — nicht als Luxus, sondern als Grundlage für systematisches Testing.
---
→ BUG1: `novaberg-bugs.md`
→ Emotionale Intelligenz: `04_K`, `04_M_a`
→ Session-Annotation: `memory/session.py`
→ API-Modelle: `api/models.py`
→ Enricher (berechnet Vektor): `01_M_c`
→ Salienz (schreibt Annotation): `01_M_g`