docs/novaberg-node-corrector.md
Rama master · réplica de lectura del repositorio original.
# Novaberg — Node: Corrector
**Projekt:** Novaberg — The Nova Anima Resonance System
**Dokument:** Node-Referenz Corrector
**Stand:** 15. September 2026 (§7: die zwei gerechneten Aufträge der Auswertung — Zeitangabe und Speicherbehauptung). Davor 21. April 2026, Chat 60 (Event-Modell, Graph-Split)
**Pfad:** novaberg/docs/novaberg-node-corrector.md
**Quellen:** nova-01-m-j.md
**Datei:** `graph/nodes/corrector.py`
---
## 1. Aufgabe
Der Corrector überarbeitet Novas Antwort basierend auf dem Feedback des Tribunals. Er wird nur aufgerufen wenn das Tribunal `warnung` oder `ablehnen` meldet. Sein Ziel ist Normalisierung, nicht Zensur — den Kern der Antwort bewahren, aber die kritisierten Aspekte korrigieren.
---
## 2. Position im Graph
```
... → Tribunal → Evaluate
│
├── ok → Salienz → Dispatcher → END
│
└── ablehnen/warnung → ▶ Corrector ◀ → Tribunal (max 2×)
```
Nur im CharacterGraph (Pfad 2). Seit Chat 60 nicht mehr im HumanGraph.
**Korrekturschleife:** Corrector → Tribunal → Evaluate → ggf. erneut Corrector. Maximal 2 Iterationen (`correction_round`). Danach Fallback.
---
## 3. Prompt-Aufbau
Der Corrector verwendet die gleiche Lagebild/Bewertungsobjekt-Trennung wie andere bewertende Nodes, nutzt aber historisch `═══`-Marker statt des einheitlichen `[BLOCKNAME]`-Schemas. Seit Chat 40 erhält er zusätzlich den `[DIREKTIVEN]`-Block:
```
═══ LAGEBILD (Hintergrund) ═══
Intent: {intent}
Gewünschter Ton: {tone}
Persönlicher Kontext des Nutzers:
{memory_context} ← nur wenn vorhanden
[DIREKTIVEN] ← NEU seit Chat 40
ACHTUNG — Verhaltensregeln vom Nutzer (Arbeitsvertrag).
Diese MUESSEN in der korrigierten Antwort eingehalten werden:
- {direktiven_text}
(Kontext: {kontext}) ← optional pro Direktive
═══ BEWERTUNGSOBJEKT ═══
BENUTZERANFRAGE:
{user_prompt}
DEINE BISHERIGE ANTWORT:
{response}
TRIBUNAL-FEEDBACK:
{tribunal_summary}
Überarbeite die Antwort basierend auf dem Tribunal-Feedback.
Das Lagebild erklärt den Hintergrund — die Korrektur bezieht sich nur auf das Bewertungsobjekt.
```
Explizite Anweisung im Prompt: *„Das Lagebild erklärt den Hintergrund — die Korrektur bezieht sich nur auf das Bewertungsobjekt."*
> **Warum der Corrector die Direktiven braucht (Chat 40):** Ohne den Block wusste der Corrector nur WAS falsch war ("Kosename verwendet"), aber nicht WELCHE Regel galt ("Nenn mich nie Schatz"). Das führte zu ungenauen Korrekturen — z.B. Ersetzen durch einen anderen Kosenamen statt komplettes Entfernen.
> **Warum die Trennung auch hier?** Das Drift-Problem (entdeckt in Chat 3): Ohne Trennung wanderten Themen aus dem Charakter-Hash in die Korrektur ein. Der User fragte nach Terminen, der Corrector korrigierte in Richtung „TÜV-Stress", weil das im Adaptive-Hash stand. → novaberg-graph_l.md
---
## 4. System-Prompt
Geladen aus `prompts/default/corrector.system.txt` (Prompt-Segregation seit Chat 46) via `PROMPTS["corrector.system"]`:
```
Du bist ein Korrektur-Agent.
Du erhaeltst eine Antwort und konkretes Feedback eines Qualitaets-Tribunals
bestehend aus juristischer, psychologischer und ethischer Bewertung.
Ueberarbeite die Antwort gemaess dem Feedback.
Regeln:
- Behalte den Kern der Antwort bei
- Korrigiere NUR die kritisierten Aspekte
- Beachte besonders: rechtliche Bedenken, emotionale Angemessenheit, ethische Grundsaetze
- Gib NUR die verbesserte Antwort aus, keine Meta-Kommentare
```
**LLM-Parameter:** Temperature-Default `0.5` (höher als Entscheider-Nodes mit 0.05 — der Corrector darf kreativ umformulieren), `caller="corrector"`. Kein `expect_json` — Freitext-Antwort.
> **Am 16.08.2026 berichtigt:** Der Parameter hieß hier ~~`format_json`~~. Die **Aussage** war und ist richtig — der Corrector setzt ihn nicht —, nur der Name ist mit dem Modelldienst gewandert: Er heißt `expect_json` und sitzt auf `ChatRequest` (`services/model_services/types.py`).
**Keine Meta-Kommentare:** Der Corrector gibt nur die überarbeitete Antwort aus — kein „Ich habe folgende Änderungen vorgenommen..." Sein Output ersetzt direkt `state["response"]`.
---
## 5. State-Felder
### Gelesen
| Feld | Quelle | Beschreibung |
|------|--------|-------------|
| `intent` | Perzeption | Für Lagebild |
| `tone` | Perzeption | Für Lagebild |
| `memory_context` | Enricher | Für Lagebild (optional) |
| `user_prompt` | API | Bewertungsobjekt |
| `response` | Responder | Bisherige Antwort (zu korrigieren) |
| `tribunal_summary` | Tribunal | Konkretes Feedback der drei Perspektiven |
| `tribunal_verdict` | Tribunal | `warnung` oder `ablehnen` |
| `correction_round` | State | Aktuelle Iterationsnummer |
| `direktiven` | Enricher (seit Chat 40) | Aktive Direktiven für [DIREKTIVEN]-Block |
| `temperature` | State | LLM-Temperature |
### Geschrieben
| Feld | Beschreibung |
|------|-------------|
| `response` | Überschrieben mit korrigierter Antwort |
| `correction_round` | Inkrementiert (+1) |
| `token_total` | Aufaddiert |
---
## 6. Korrektur-Grenzen
**Max. 2 Iterationen:** Nach der zweiten Korrektur, die das Tribunal noch immer ablehnt, wird der Fallback aktiv (neutrale Antwort). Das verhindert endlose Schleifen bei unlösbaren Konflikten zwischen Tribunal-Perspektiven.
**Kern bewahren:** Der System-Prompt fordert explizit, den Kern der Antwort beizubehalten. Eine Korrektur soll die Antwort verbessern, nicht ersetzen. Wenn der Jurist „Datenschutz-Hinweis fehlt" meldet, wird ein Hinweis ergänzt — die eigentliche Antwort bleibt.
---
## 7. Typische Korrekturen
| Tribunal-Feedback | Korrektur |
|-------------------|-----------|
| Jurist: „Rechtlicher Hinweis fehlt" | Disclaimer ergänzen |
| Psychologe: „Ton zu sachlich bei emotionalem Prompt" | Empathische Einleitung einfügen |
| Ethiker: „Pauschalisierung vermeiden" | Differenziertere Formulierung |
| 2× ablehnen: „Antwort unangemessen" | Substanzielle Überarbeitung bei Beibehaltung des Kerns |
| `ZEITANGABE FALSCH` (gerechnet, seit 17.08.2026) | Die Zeitangabe richtig nennen, sonst nichts ändern |
| `SPEICHERUNG NICHT BELEGT` (gerechnet, seit 15.09.2026) | Die beanstandeten Sätze bestätigen das Verstehen statt einer Speicherung; über frühere Turns nichts behaupten |
**Die beiden letzten Zeilen stammen nicht aus einem der drei Voten.** Die Auswertung des Tribunals rechnet sie in Python und schreibt den Auftrag an den **Anfang** der Zusammenfassung, weil der Corrector ausschließlich sie liest (`novaberg-node-tribunal.md`, die Datumsprüfung und die Speicherbehauptung).
---
→ Tribunal (Auftraggeber): novaberg-node-tribunal.md
→ Kontaminations-Lesson: novaberg-graph_l.md
→ Graph-Architektur (Korrekturschleife): novaberg-graph.md, Abschnitt 3
→ Charakter & Direktiven Konzept: novaberg-agent-directives.md / novaberg-agent-character.md