Ctrl K
ComunidadGuías…

docs/novaberg-ei-dual-emotion_b.md

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

Archivo original ↗Preguntar a KiBot
# Novaberg — Dual-Emotion Phase 2: Novas Emotionsstrang (Bauplan und Umstellung)

**Teil 3 von 5 — Bauplan und Umstellung.** Absicht und Kopfblock: [`novaberg-ei-dual-emotion_k.md`](novaberg-ei-dual-emotion_k.md) · Ausarbeitung: [`novaberg-ei-dual-emotion_t.md`](novaberg-ei-dual-emotion_t.md) · Diskussion und Ergänzungen: [`novaberg-ei-dual-emotion_e.md`](novaberg-ei-dual-emotion_e.md). Die Abschnittsnummern sind die des ungeteilten Konzepts; welche Datei einen Abschnitt trägt, sagt die Tabelle *„§ → Datei“* in `_k`.

---

## 8. Graph-Änderungen

### 8.1 Neuer Node: EI-Calc + Enricher vor Router

```
Perzeption → Enricher(laden) → EI-Calc → Router → [Planner → Agent-Dispatch] → GV-Node → ...
```

**Enricher vor Router (NEU):** Der Enricher lädt alle Daten (Session, KZG, LZG, Hash) bevor der Router entscheidet. Der Router sieht dadurch die volle Session mit Metadaten und die EI-Ergebnisse. Löst ROUTE-MISS1: "Ja, bitte!" nach "Soll ich einen Termin anlegen?" wird erkannt, weil der Router den Kontext hat.

EI-Calc übernimmt Abschnitt 5 des bisherigen Enrichers (alles unter "Emotionale Intelligenz"). Der Enricher behält Abschnitte 1–4 (Session, Plugins, Charakter-Anweisungen, KZG/LZG, Hash).

### 8.2 Asynchroner Block nach Tribunal

Kein neuer Graph — sequentielle Funktionsaufrufe nach der Antwort-Auslieferung. Zwei getrennte Pfade:

**Nova (voller Pfad):** Perzeption(Nova) → Enricher(Nova) → EI-Calc(Nova) → Router(Nova) → [Agent] → Salienz(Nova) → Dispatcher(Nova). Derselbe Code wie synchron, mit `ASSISTANT_USER_ID`. Novas Enricher lädt ihre eigenen Session-Turns.

**User (nur speichern):** Salienz(User) → Dispatcher(User). Die Daten liegen bereits im State vom synchronen Durchlauf — kein Enricher oder EI-Calc nötig.

### 8.3 API-Response erweitert

`GespraechAntwort` wird um Novas Emotionsdaten ergänzt:

| Feld | Beschreibung |
|------|-------------|
| `nova_emotion` | Novas berechnete Emotion für diesen Turn |
| `nova_arousal` | Novas Arousal |
| `nova_emotions_vektor` | Novas Richtungsvektor |

Ermöglicht dem GTK4-Client die Visualisierung beider Emotionsströme im Emotions-Panel (Radar: User vs. Nova).

---

## 10. Arbeitspakete

| # | Paket | Beschreibung | Status |
|---|-------|-------------|--------|
| 1 | **EI-Extraktion** | ~600 Zeilen aus Enricher → `ei/berechnung.py`. Enricher importiert sie. Reines Refactoring, null Funktionsänderung. | ✅ Chat 58 |
| 2 | **EI-Calc-Node** | Neuer Node `graph/nodes/ei_calc.py`. Ruft extrahierte Funktionen auf. Graph-Kante: Enricher → EI-Calc → Router (Enricher vor Router!). | ✅ Chat 59 |
| 3 | **Nova-Emotion Berechnung** | EI-Calc berechnet Nova-Emotion(N) aus Historie + Empathie. Neue State-Felder. | ✅ Chat 59 |
| 4 | **Perzeption(Nova) + EI-Calc(Nova)** | Perzeption-Aufruf auf `response` nach Tribunal. EI-Calc direkt danach. Prompt-Anpassung. | ✅ Chat 60 — Durch Event-Modell ersetzt. Perzeption läuft in Pfad 1 (HumanGraph), Ergebnisse in der Session. |
| 5 | **Router(Nova) + Commitment** | Router-Aufruf auf Nova-Response. Bei Commitment → Planner → Agent. | ✅ Chat 60 — Router im CharacterGraph (Pfad 2). Commitments werden normal geroutet. |
| 6 | **Salienz(Nova)** | Eigener Salienz-Call für Novas Aussagen. Prompt-Anpassung. | ✅ Chat 60 — Salienz im CharacterGraph (Pfad 2). Keine eigene Salienz(Nova) nötig. |
| 7 | **Asynchroner Block** | Nova-Pfad: Perzeption → Enricher → EI-Calc → Router → [Agent] → Salienz → Dispatcher. User-Pfad: Salienz → Dispatcher. | ✅ Chat 60 — Async-Block durch Event-Consumer ersetzt. |
| 8 | **API + Client** | `GespraechAntwort` erweitern, Emotions-Panel: Dual-Radar. | 🔧 API ✅, Responder [EIGENE_EMOTION] ✅, Client-Panels offen |
| 9 | **Dokumentation** | Graph-Doku, Enricher-Doku, EI-Doku, Roadmap, Backlog aktualisieren. | ✅ Chat 66 — alle Dokumente aktualisiert |

### Chat-61-Nachträge (Akkumulationsrefactor + Perzeption-Symmetrie)

Drei wesentliche Verfeinerungen nach der Kernimplementierung:

1. **Rollen-Split im EI-Calc:** State-Flag `ei_calc_rolle` ("user" | "character") trennt die Berechnungspfade sauber. `_ei_calc_user()` und `_ei_calc_character()` sind separate Funktionen.

2. **Akkumulationsrefactor:** Drei biologisch motivierte Mechanismen ersetzen die einfache Decay-Summierung:
   - Aktueller Turn nach seiner Reizstärke (seit 31.08.2026), Historie als Echo (15% — `EMOTION_HISTORIEN_GEWICHT`)
   - Harter Cap bei 4.0 (`EMOTION_GLAETTUNGS_MAXIMUM`) — seit dem 31.08.2026, zusammen mit dem erregungsabhängigen Turn-Beitrag; Herleitung in `novaberg-ei.md` §Reizstärke
   - sin^0.5-Glättungskurve für den Anzeigebereich [0, 1] — steil unten (kleine Andeutungen sichtbar), sanft oben (aufbauend statt sofort ausschlagend)

3. **Perzeption-Symmetrie:** Perzeption läuft nun in beiden Graphen — als erster Node im HumanGraph (User-Prompt, `perzeption_rolle: "user"`) und als letzter Node im CharacterGraph nach Corrector/Evaluate (Nova-Antwort, `perzeption_rolle: "assistant"`). Nach jedem Turn sind beide Emotionen im Session-Turn annotiert.

→ Details: `novaberg-node-ei-calc.md` §§ Rollen-Split, Akkumulation

---

## 11. Ausblick

### Phase 3: Ziel-Vektor (Antrieb)

Dritte Kraft auf Novas Emotion: aktivierte Zielsätze injizieren Emotion über Embedding-Similarity. Novaberg-thinking-drive_k.md §4.3. Benötigt die `ziele`-Tabelle und Gravitationsberechnung.

### TurnOrchestrator (überholt)

Ursprünglich als sternförmiger Orchestrator konzipiert, der regelbasiert entscheidet, welcher Node als nächstes läuft. **Seit Chat 60 durch das Event-Modell ersetzt:** Zwei separate Graphen (HumanGraph + CharacterGraph), verbunden durch eine Redis-Event-Queue. Der TurnOrchestrator als separates Epic ist damit konzeptionell überholt. Siehe `novaberg-convention-event-model.md`.

---