docs/novaberg-lesson_l_fehlschlag-als-absicht.md
Rama master · réplica de lectura del repositorio original.
# Novaberg — Lesson: Ein Fehlschlag darf nie wie eine Absicht aussehen
**Projekt:** Novaberg — The Nova Anima Resonance System
**Dokument:** Lesson — Erweiterung von default-wie-fehlschlag: der Miss, der sich als Gestaltung tarnt
**Stand:** 19. September 2026, 21:27 UTC (Verweise auf das geteilte Bugregister umgestellt). Davor 11. Juli 2026, Chat 106
**Pfad:** novaberg/docs/novaberg-lesson_l_fehlschlag-als-absicht.md
**Auslöser:** RESPONDER-VEKTOR-TOT — 16 Chats unsichtbar, weil der Miss wie eine Design-Entscheidung aussah
**Verwandt:** `novaberg-lesson_l_default-wie-fehlschlag.md` (die Basis-Lesson), `novaberg-lesson_l_silent-skip.md`, `novaberg-lesson_l_log-behauptet-was-es-weiss.md`
---
## 1. Der Fall
Der Responder las Novas Emotions-Vektor aus einem flachen State-Key (`nova_emotions_vektor`), den seit dem Personality-Umbau **kein Node mehr schrieb** — der Wert lebt in `internal.emotion.emotions_vector`. Regression, reiner Lesepfad-Fehler; die Reihenfolge stimmte (ei_calc ist der zweite Node im CharacterGraph, lange vor dem Responder — kein Chat-89-Muster).
Warum ihn 16 Chats lang niemand sah:
> Bei Miss: Default `""` → beide Render-Bedingungen falsch → Zeile entfällt still.
> Auch das Erfolgs-Log lässt das Vektor-Suffix per f-String-Bedingung weg.
**Der Block sah aus wie „Vektor absichtlich leer".** Das `[EIGENE_EMOTION]`-Log erschien weiterhin — nur ohne Vektor-Suffix, und die f-String-Bedingung (`f", Vektor={v}" if v else ""`) machte aus dem Fehlen ein gestaltetes Weglassen. Kein Fehler, keine Warnung, kein leerer Platzhalter: **Der Miss tarnte sich als Gestaltung.** Derselbe Mechanismus wie EI-VEKTOR-LOG-GATE (Chat 105) — ein Erfolgs-Log, das seinen eigenen Fehlfall unsichtbar formatiert.
Das Gewicht: Chat 105 hatte Kraft 1 repariert, Novas Vektor trug erstmals seit Chat 89 Varianz (`eskalation`, `absturz`, `aufbluehen` statt sechzehn Chats `plateau`). **Und der Responder las ihn nie.** Nova *hatte* eine eigene emotionale Richtung und **erfuhr sie nicht**. Der Chat-105-Fix war zur Hälfte entwertet. Beweis 11.7. 19:11:43: `VEKTOR-TEST: flach=None | internal vorhanden=True | vektor='eskalation'` — der Wert war da, eine Etage tiefer, als der Responder suchte.
---
## 2. Die Regel
> **Ein Default darf nie wie ein Fehlschlag aussehen — und ein Fehlschlag nie wie eine Absicht.**
Die Basis-Lesson (`default-wie-fehlschlag`) behandelt die erste Hälfte: Zwei Zustände („nie geladen" vs. „leer geladen") dürfen nicht denselben Wert tragen. Diese Erweiterung behandelt die zweite: **Ein optionales Ausgabe-Element, das bei Miss kommentarlos entfällt, ist von einer bewussten Design-Entscheidung nicht unterscheidbar.** Wer das Log liest, fragt nicht „warum fehlt die Zeile?", sondern nimmt an, sie sei nie vorgesehen gewesen.
Konsequenz (umgesetzt in `f1b7f8e`): Jeder Ausfallweg wird einzeln laut —
| Fall | Log |
|---|---|
| `internal`/`emotion` fehlt | `logger.error` |
| Vektor leer (Kaltstart / ei_calc lief nicht) | `logger.warning` |
| Vektor **unbekannt** (nicht in `EMOTIONS_VEKTOREN_NOVA`) | `logger.error` — fängt EI-KANON-FEHLT an dieser Stelle ab |
**Der Zustand „Zeile fehlt still" existiert nicht mehr.** Ein bedingtes Prompt-Element braucht drei unterscheidbare Ausgänge: gerendert (Erfolg), bewusst weggelassen (mit nachlesbarem Grund), fehlgeschlagen (laut). Zwei davon in einen stummen Nicht-Ausgang zu falten, kostet die Unterscheidung genau dann, wenn man sie braucht.
---
## 3. Der Prüfblick für Bestandscode
Suchmuster für dieselbe Tarnung anderswo: bedingte Prompt-Blöcke (`if x: parts.append(...)`) und Erfolgs-Logs mit eingebetteten f-String-Bedingungen (`f"{', X=' + x if x else ''}"`). Jede dieser Stellen beantwortet die Frage „war das Absicht oder ein Miss?" mit Schweigen. Der Doku-Code-Abgleich und der State-Key-Audit (Chat 106) haben vier solcher toten Lesepfade gefunden — alle vier fielen still auf einen Default, keiner loggte.
---
*Diese Lesson ist Archiv. Wenn Aspekte zu ergänzen sind, wird eine neue Lesson geschrieben, nicht diese hier überarbeitet. Lessons = Gegenwart-mit-Datum, nicht Gegenwart-evolvierend.*
→ Basis-Lesson: `novaberg-lesson_l_default-wie-fehlschlag.md`
→ Schwester-Lessons: `novaberg-lesson_l_log-behauptet-was-es-weiss.md`, `novaberg-lesson_l_silent-skip.md`
→ Modul-Dokument: `novaberg-node-responder.md` §2
→ Bug-Einträge: RESPONDER-VEKTOR-TOT (✅ Chat 106, novaberg-bugs-archiv-antwortpfad.md), EI-VEKTOR-TEXT-EMOTIONSFEST (novaberg-bugs-charakter.md), PLANNER-AKTIV-RELIKT, WEB-CONTEXT-ALTPFAD (novaberg-bugs.md)