# 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