docs/novaberg-bugs-archiv-charakter.md
Rama master · réplica de lectura del repositorio original.
# Novaberg — Bugs, Archiv: Charakter — Profile, Räder, Haltung, Emotion, Destillation
**Inhalt:** die abgeschlossenen Defekte dieses Gegenstands, ~~29~~ → ~~30~~ → ~~32~~ → ~~35~~ → ~~37~~ → 38 Eintraege (08.11.2026: `TOR-ABLEHNUNG-MELDET-ABGESCHLOSSEN` aus dem offenen Teil, bezeugt, vor dem Commit an einer Wegwerf-Datenbank gemessen und mit dem Commit des Code-Trees `33a7b83` geschlossen, Kennung wird nachgetragen, im Betrieb nicht gemessen; 06.11.2026, unverändert 37: `PERZEPTIONSFELDER-OHNE-KANON` und `KANON-FELDER-NEHMEN-FREMDWERTE`, der Tag der Schließung in der Zustandszeile berichtigt, der Commit ist vom 05.11.2026; 26.10.2026, abends: `PERZEPTIONSFELDER-OHNE-KANON` und `KANON-FELDER-NEHMEN-FREMDWERTE` aus dem offenen Teil, bezeugt, vor dem Commit an gespeicherten Modellausgaben gemessen und mit dem Commit des Code-Trees `6feb70a` (`e71df6b`, die Doku dazu `7b35557`) geschlossen, im Betrieb nicht gemessen; 26.10.2026: `ZURUECKHALTUNG-GILT-ALS-ZUSTIMMUNG`, `DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS` und `DIREKTIVEN-KENNUNG-UNGEPRUEFT` aus dem offenen Teil, im Betrieb gemessen; 25.10.2026: `ABLEHNUNG-OHNE-STAMM-BESTAETIGT` und `WURZELN-ABLEHNUNG-UNGELESEN` aus dem offenen Teil; 18.10.2026: `ZUSTIMMUNG-GILT-ALS-ABLEHNUNG` aus dem offenen Teil), je mit `CHA` als Kategorie.
**Wegweiser:** [`novaberg-bugs-archiv.md`](novaberg-bugs-archiv.md) — Kopf, Formregel und die Kurzeintraege der alten Tabelle. **Findemittel ueber alle Bugs:** [`novaberg-bugs-index.md`](novaberg-bugs-index.md). **Offenes Register:** [`novaberg-bugs.md`](novaberg-bugs.md).
**Die Abschnittsueberschriften stammen aus dem ungeteilten Archiv** (geteilt am 19.09.2026) und sagen, *wann und wobei* ein Eintrag entstanden ist — nicht, welchen Gegenstand er hat. Den sagt die Datei, in der er steht.
---
## 08.11.2026 — bezeugt, vor dem Commit an einer Wegwerf-Datenbank gemessen und mit dem Commit geschlossen, im Betrieb nicht gemessen
**Dieser Eintrag stand seit dem 24.10.2026 im offenen Register** (Abschnitt *24.10.2026 — aus der Klassifizierung der Funde vom 24.10.2026*, dort bleibt ein Verweis hierher). Gebaut, bezeugt und gegengeprüft am 07.11.2026, vor dem Commit an einer Wegwerf-Datenbank gemessen am 08.11.2026; er ist mit dem Doku-Zug zu seinem Bau geschlossen, die Commit-Kennung wird nachgetragen.
---
### `TOR-ABLEHNUNG-MELDET-ABGESCHLOSSEN` — Direktiven und Notizen melden eine Ablehnung als `abgeschlossen` statt mit dem Status `dismissed` ✅
**Kategorie:** CHA
**Rang:** **mittel** — still: Keine Logzeile meldet die Abweichung, und sie verfälscht das Protokoll, nach dem gezählt wird — eine Ablehnung steht dort wie eine Ausführung; dazu bekommt der Responder einen Auftrag für einen Erfolg. Nicht hoch, weil die Fachtabelle stimmt und der Satz im Auftrag sagt, dass nichts geändert ist. Vergeben am 24.10.2026 gegen HEAD `2702d94`.
**Zustand:** **geschlossen mit dem Commit des Code-Trees `33a7b83` (Kennung wird nachgetragen)** — die zehn Dateien des Baus sind blobgleich mit denen des Trees `d5163ed` auf `7b35557`, an dem Suite und MESSUNG liefen —, bezeugt, gegengeprüft, vor dem Commit an einer Wegwerf-Datenbank gemessen, **im Betrieb nicht gemessen**. **Gebaut** `[Code]`: `read_answer` (`server/agents/direktiven/resume.py`) gibt auf eine Ablehnung — einer Ja/Nein- wie einer Auswahlfrage — `status` `dismissed` mit `REFUSED_TEXT` zurück; `_STATUSES` führt `dismissed` statt `abgeschlossen`, die Ausgabe-Verifikation steht. `_resume_nicht_gefunden` (`server/agents/notizen/resume.py`) gibt `dismissed` mit *„Okay, '…' wird nicht angelegt.“* zurück, und `_nach_resume` (`server/agents/notizen/agent.py`) beendet den Graphen darauf; der Eintrag `abgeschlossen` dort war tot und ist entfallen. Beide `_build_return` (`direktiven/dispatch.py`, `notizen/dispatch.py`) setzen bei `dismissed` `management_result` auf den Text, damit er im `pipeline_log` steht. `_build_task_dismissed` (`server/graph/nodes/planner.py`) schreibt den Datenteil als `- <dienst>: <text>`, ohne das Wort *Agent*, wie die Blöcke für Erfolg und Ablehnung seit dem 20.08.2026. Die Leser — Thinker, `_ausgang_vermerken`, die Prüfung der Speicherbehauptung, das Tribunal, `_build_task_block` — lasen `dismissed` schon richtig und sind unverändert; `ausgaenge` bleibt, `dismissed` ist laut Kanon kein Ausgang.
**Zeugen** `[Test]`: `server/tests/test_gate_refusal.py`, 21 Zeugen in 8 Klassen — jede Statusmenge der Regel als eigenes Literal, rot bei Wachsen und Schrumpfen; *„nein“* über den echten `agent_dispatch_node` je Dienst, mit Status und Text im Protokoll, nichts geschrieben, dem Block aus `aufgabe_verworfen` ohne das Wort *Agent* und ohne Wartezustand danach; der Zwilling *„ja“* führt aus und endet `abgeschlossen`, eine unklare Antwort erneuert den Wartezustand; je Leser ein Zeuge. Nachgezogen sind die Zeugen, die für ein Nein `abgeschlossen` erwarteten: 4 in `tests/agents/direktiven/test_resume.py` (dazu ein neuer Zwilling), 11 in `tests/agents/notizen/test_resume.py`. Server-Suite am Tree `d5163ed` **`Ran 5630 tests` · `OK (expected failures=2)`**.
**Gegenprobe** `[gemessen 07.11.2026, labor/2026-11-07_tor_gegenprobe.txt]`, am ersten Tree des Baus (`55f8d66`): 44 Eingriffe, je vorher vorhergesagt — **36 genau, 1 abweichend, 7 blind**, alle 7 vorhergesagt. Die Abweichung ist ein Fehler der Vorhersage (zwei Zeugen tragen am Ende einen Zwilling, der löscht). Von den 7 blinden war einer eine echte Lücke: Erneuerten die Notizen nach dem Nein den Wartezustand, blieb jeder Zeuge grün, und der nächste Satz des Menschen liefe als Antwort; seither hält ihn `test_no_leaves_no_pending_state`, mit dem Zwilling `test_unclear_answer_renews_the_pending_state`. Die übrigen 6 sind gleichwertig, unerreichbar oder ohne Leser. Die Eingriffe zum zweiten Tree (`d5163ed`: das Wort *Agent*, der Wartezustand, der tote Eintrag) sind vorhergesagt und dort nicht gezählt.
**MESSUNG vor dem Commit** `[gemessen 08.11.2026, labor/2026-11-08_tor_messung.txt]`: am Tree `d5163ed` gegen eine Wegwerf-Datenbank und einen Wegwerf-Redis, mit dem echten `agent_dispatch_node`, beiden Graphen, `crud`, `suchen` und dem echten Schreiber des `pipeline_log`; ersetzt war nur der Modellweg, durch einen Riegel, der vor jedem Netzzugriff wirft. Sechs Zellen, je ein Turn der Frage und einer der Antwort: die Direktiven ohne und mit gesätem Ziel und die Frage der Notizen nach einer nicht gefundenen Notiz, je *„nein“* und *„ja“*. **Alle sechs wie vorhergesagt:** Jedes *„nein“* steht als `dismissed` samt Text in der Zeile `node='agent_dispatch'` des Turns der Antwort (3 von 3), keine Fachtabelle ändert sich (Zeilen, `aktiv` und Prüfsumme über alle 33 Tabellen, 3 von 3), der Block kommt aus `aufgabe_verworfen` ohne das Wort *Agent*, und es bleibt kein Wartezustand. Kein *„ja“* endet als `dismissed` (3 von 3): Mit gesätem Ziel löscht es und endet `abgeschlossen`, ohne Ziel endet es `fehler`, bei den Notizen am Riegel vor dem Modell. **Grenzen:** gemessen ist der Knoten, nicht der ganze Graph — Router, Thinker, Vermerk, Speicherbehauptung, Tribunal und Responder liefen nicht; kein Vergleich am Eltern-Commit; nur *„nein“* und *„ja“*; das Anlegen einer Notiz nach *„ja“* und die Antwort des Modells auf den Block sind ungemessen.
*Zustand bis 08.11.2026:* offen — am Code gelesen am 24.10.2026 gegen `2702d94`, nicht gelaufen. Wie das Modell den gemischten Auftrag beantwortet, ist *unbelegt*.
**Befund** `[Code]`: Der Weg einer Ablehnung am Tor der Direktiven — `read_answer` gibt `status` `abgeschlossen` mit `REFUSED_TEXT` zurück (`server/agents/direktiven/resume.py`, Z. 303–309); `dispatch._handle_resume` übernimmt den Status in das `AgentResult` (Z. 181–189), und `_build_return` setzt `management_result` auf den Text (Z. 211–213); `server/graph/nodes/agent_dispatch.py::_handlung_protokollieren` schreibt `status` aus dem letzten `AgentResult` (Z. 74) und `ergebnis` aus `management_result` (Z. 83). Die Zeile im `pipeline_log` mit `node = 'agent_dispatch'` und `quelle = 'direktiven'` trägt nach einer Ablehnung `abgeschlossen` wie nach einem Löschen, unterscheiden lässt sie nur der Text in `ergebnis`. Die Schritte des Agenten (`abgelehnt`) erreichen das Log nicht — außerhalb der Agenten liest niemand `AgentResult.schritte` (gesucht in `graph/`, `services/`, `memory/`, `api/`, `main.py`) —, und in `agents/direktiven/` schreibt nichts ins `hintergrund_log`. **Die Ursache:** Der Kanon hat für genau diesen Ausgang einen eigenen Status, `dismissed`, *„Rueckweg der Rueckfrage — der Mensch sagt nein“* (`server/agents/base.py`, Z. 55–72). `charakter_identitaet` (`resume.py`, Z. 64) und `dateien_wurzeln` (`resume.py`, Z. 155 und 203) setzen ihn, `direktiven` setzt `abgeschlossen`. **Ebenso die Notizen:** `_resume_nicht_gefunden` meldet die Ablehnung mit `abgeschlossen` (*„Okay, '…' wird nicht angelegt.“*, `server/agents/notizen/resume.py`, Z. 293–302).
**Wirkung.** Drei Folgen über das Log hinaus. Der Planner nimmt `abgeschlossen` als Erfolg (`server/graph/nodes/planner.py`, Z. 93–96, 136–138) und baut `[AUFGABE]` aus `responder.aufgabe_erfolg` (*„Der Nutzer hat dich um etwas gebeten, und du hast es getan“*), mit dem Satz *„Gut, dann lasse ich es …“* darin; für `dismissed` gäbe es `responder.aufgabe_verworfen` (Z. 132–134, 175–182). `REGISTER.bearbeitung_zaehlen` zählt den Ausgang als `abgeschlossen` (`agent_dispatch.py`, Z. 166–169). Und nach dem Docstring von `_handlung_protokollieren` (Z. 41–42), der `initiator` und `status` zusammen als Antwort auf *„was hat sie selbst angelegt“* nennt, zählt eine Ablehnung als Handlung. Wer den Ausgang zählt, zählt einen Text — auch die MESSUNG von `DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS`.
**Geschlossen, wenn** eine Ablehnung am Tor der Direktiven und auf die Frage der Notizen nach einer nicht gefundenen Notiz mit `dismissed` endet, so im `pipeline_log` steht und der Planner die Antwort aus `aufgabe_verworfen` baut — bezeugt je Dienst mit einer Ablehnung und einem Zwilling, der ausführt.
**Warum geschlossen:** Die Bedingung *Geschlossen, wenn* ist erfüllt — eine Ablehnung am Tor der Direktiven und auf die Frage der Notizen nach einer nicht gefundenen Notiz endet mit `dismissed`, steht so im `pipeline_log` (gemessen an der Wegwerf-Datenbank), und der Planner baut die Antwort aus `aufgabe_verworfen`; bezeugt je Dienst mit einer Ablehnung und einem Zwilling, der ausführt. Sie verlangt keine Messung im Betrieb. **Nicht Teil der Bedingung und offen:** Eine Klärung der Timeline endet auf jede Antwort, auch auf *„nein“*, mit `abgeschlossen`, ohne etwas zu schreiben — welchen Status sie tragen soll, ist eine Absicht und nicht entschieden (Fundliste, 07.11.2026); auf die Auswahl- und die Duplikat-Frage der Notizen kann ein verneinter Satz weiter schreiben (`NOTIZ-VERNEINUNG-UEBERLESEN`, [`novaberg-bugs-wissen.md`](novaberg-bugs-wissen.md)); `charakter_identitaet` setzt `dismissed` schon, sein `_build_return` trägt den Text aber nicht ins Protokoll (Fundliste, 07.11.2026).
**Offen:** Eine Absichtsfrage gibt es nicht, der Kanon entscheidet. Zwei Fallen für den Bau: `notizen/agent.py::_nach_resume` (Z. 163–176) schickt nur `fehler`, `rueckfrage` und `abgeschlossen` nach `END`, ~~ein `dismissed` ginge dort nach `ausfuehren`~~ → **widerlegt am 07.11.2026** `[gemessen 07.11.2026, labor/2026-11-07_tor_gegenprobe.txt]`: Fehlt `dismissed` in `_nach_resume`, geht ein Nein auf `add_content` oder `remove_content` nach `suchen`, die Frage kommt erneut, und nichts wird angelegt; nach `ausfuehren` geht nur `create`, und eine Frage nach einer nicht gefundenen Notiz trägt nie `create`. Die Falle war echt, ihre Folge eine andere. Seit dem Code-Tree `33a7b83` steht `dismissed` in der Menge, der tote Eintrag `abgeschlossen` ist entfallen, und ein ausdrückliches `dismissed` nach `ausfuehren` ist bezeugt; `direktiven/resume.py` führt `_STATUSES` (Z. 76) ohne `dismissed`, und die Ausgabe-Verifikation (Z. 337) würfe. → Bestätigt am 07.11.2026: Nur den Status zurückzustellen, ohne `_STATUSES`, macht 10 Zeugen rot, laut (dieselbe Gegenprobe). Ob die MESSUNG von `DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS` vor oder nach diesem Bau läuft, ist nicht festgelegt. → Sie lief am 26.10.2026 vor diesem Bau und zählte den Ausgang am Wartezustand und an der Tabelle `direktiven`, nicht am `pipeline_log`.
**Zusammenhang:** `DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS` (Archiv, [`novaberg-bugs-archiv-charakter.md`](novaberg-bugs-archiv-charakter.md)) — sein Zustand nennt den Befund als Hinweis zur Messung; `PIPELINE-LOG-MERGE-BLIND` ([`novaberg-backlog-gedaechtnis.md`](novaberg-backlog-gedaechtnis.md)) betrifft die Dublette der Promotion, nicht diesen Fall; [`novaberg-agent-directives.md`](novaberg-agent-directives.md) §3.
---
## 26.10.2026, abends — bezeugt, vor dem Commit an gespeicherten Modellausgaben gemessen und mit dem Commit geschlossen, im Betrieb nicht gemessen
**Diese zwei Einträge sind mit einem Bau geschlossen, wie sie am 15.10.2026 gemeinsam entschieden waren:** Ein Wert außerhalb des Kanons wird an der Verwendungsstelle abgefangen, nicht in der Perzeption. Beide Schließbedingungen sind Eigenschaften des Codes und verlangen keine Messung im Betrieb; gemessen ist vor dem Commit an Modellausgaben, die der Betrieb gespeichert hatte. Die Zustandszeilen nennen Code-Tree, Zeugen, Messung und was im Betrieb nicht gemessen ist; die Commit-Kennung wird nachgetragen. → Committet am 05.11.2026 als `e71df6b`, die Doku dazu als `7b35557`. Im offenen Register stand `PERZEPTIONSFELDER-OHNE-KANON` im Abschnitt *Einzelbefunde ohne eigenen Datumsabschnitt*, einer von mehreren — der Abschnitt bleibt dort stehen; `KANON-FELDER-NEHMEN-FREMDWERTE` war der einzige Eintrag dieses Gegenstands im geteilten Abschnitt vom 08.08.2026 über die Funde vom 27. bis 30.07.2026, der dort mit einem Verweis hierher stehen bleibt.
---
### `PERZEPTIONSFELDER-OHNE-KANON` — drei Felder ohne Riegel, Default am Maximum ✅
**Kategorie:** CHA
**Rang:** **hoch** — still, der Wert wird gespeichert: Ein Intent außerhalb des Kanons bekommt den Faktor 1,0, den höchsten (`server/ei/berechnung.py:854-855`). Durchsicht 05.10.2026, gegen HEAD `17bf86e`: gilt; es gibt nur die Spur `kanon_ausreisser`, keinen Riegel.
**Zustand:** **geschlossen ~~am 26.10.2026~~ → am 05.11.2026 mit dem Commit des Code-Trees `6feb70a` (Kennung wird nachgetragen → committet als `e71df6b`, die Doku dazu als `7b35557`)** — die acht Dateien des Baus sind blobgleich mit denen des Trees `56ddcae` auf `de16bea`, an dem die Suite und die letzte Gegenprobe liefen —, bezeugt, vor dem Commit an gespeicherten Eingaben gemessen, Server-Suite grün, **im Betrieb nicht gemessen**. Erfüllt sind beide Hälften der Schließbedingung, am Bau nachgesehen: **Jedes der drei Felder hat einen Riegel mit Fehlerzeile an jeder Stelle, an der es über eine Faktortabelle gelesen wird** — `intent` und `tone` im EI-Gate auf beiden Seiten (`ei_calc` für den Nutzer, `ei_calc_persist` für Nova), `intent` des Nutzers dazu in der Faszination, `sprach_stil` Novas in der Neugier. **Und kein Vorgabewert ist der höchste seiner Tabelle**, gesucht nach `<TABELLE>.get(<feld>, <Zahl>)` unter `server/`: Die acht Faktortabellen der Kanon-Felder tragen einen neutralen Faktor unter ihrem Maximum, die vier Ziel- und Deltatabellen von Raum und Gesprächsvektor ihre Vorgabe auf dem Eintrag `neutral` (`GV_NAEHE_DYNAMIK`, `GV_NAEHE_STIL`, je 0,5), auf dem Minimum (`GV_TIEFE_MODUS`, 0,3) oder innerhalb (`GV_LAENGE_MODUS_DELTA`, 0,0).
**Nicht Teil der Bedingung, und als Fund geführt** (Fundliste, 26.10.2026, *Die Ziel- und Deltatabellen von Raum und Gesprächsvektor lesen Perzeptionsfelder ohne Riegel*): Dort lesen `sprach_stil` und `beziehungs_dynamik` ohne Fehlerzeile. Für den `sprach_stil` des Nutzers ist `GV_NAEHE_STIL` die einzige Tabelle — ein fremder Wert trägt dort außer der Spur `kanon_ausreisser` der Perzeption keinen Riegel.
**Gebaut** `[Code]` (`server/config.py`, `server/ei/berechnung.py`, `server/ei/neugier.py`, `server/ei/fascination.py`): Jeder Leser einer der acht Faktortabellen eines Kanon-Felds liest über eine Prüfung mit einem benannten neutralen Faktor neben der Tabelle — `_ei_faktor_lesen` im EI-Gate (`EI_DYNAMIK_FAKTOREN`, `EI_INTENT_FAKTOREN`, `EI_TONE_FAKTOREN`), `_neugier_faktor_lesen` in den Säulen M, D und S der Neugier (`GV_AUFNAHMEBEREITSCHAFT_MODUS`, `…_DYNAMIK`, `…_STIL`), `_aus_tabelle` in der Faszination (`FASZ_INTENT_FAKTOREN`, `FASZ_MODUS_FAKTOREN`). **Der neutrale Faktor ist der Eintrag `neutral` der Tabelle, wo sie einen trägt, sonst das arithmetische Mittel ihrer Werte**, als Literal eingetragen: EI-Dynamik 1,0 (Eintrag), EI-Intent 0,533, EI-Ton 0,725, Neugier-Modus 1,140, Neugier-Dynamik und Neugier-Stil 1,0 (Eintrag), Faszination-Intent 1,000, Faszination-Modus 1,020. Ein Wert außerhalb der Tabelle bekommt ihn mit einer ERROR-Zeile, die Feld und Wert nennt; ein neutraler Faktor, der nicht unter dem Maximum seiner Tabelle liegt, wirft. Die Faszination meldet seither auf ERROR statt WARNING und gibt auch einem leeren Wert den neutralen Faktor, still wie vorher — bei `mode` 1,020 statt 1,0. Bis dahin galt an allen acht Stellen 1,0, und beim Intent ist 1,0 der höchste Wert der Tabelle.
**Zeugen** `[Test]`: `server/tests/test_kanon_usage.py`, 45 Zeugen in 12 Klassen — das EI-Gate mit den gemessenen Fremdwerten (`philosophischer_austausch` in `intent`, `begeisterung` in `tone`) ergibt 0,3839 statt 0,5 und je Feld eine Fehlerzeile; die Neugier läuft mit fremdem Modus, Stil und Dynamik ganz durch, und ihr Ergebnis ist mit allen sechs Säulen ungleich 1,0 als Literal bezeugt (0,66595 im Kanon, 0,66854 fremd), sodass das Streichen jeder Säule rot wird; je Tabelle das Literal des neutralen Faktors, unter dem Maximum, nicht unter dem Minimum und nach dem Kriterium gleich dem Eintrag `neutral` oder dem Mittel; die Suche über den Syntaxbaum zählt je Datei genau die Aufrufe der drei Prüfungen mit dem richtigen Paar aus Tabelle und neutralem Faktor (3 / 3 / 2) und findet keinen Leser daneben. Server-Suite **`Ran 5566 tests` · `OK (expected failures=2)`**.
**Gegenprobe** `[gemessen 26.10.2026]`, in drei Runden, jeder Eingriff gegen die ganze Suite und vorher vorhergesagt — 26 Eingriffe am ersten Stand der Zeugen, 24 am zweiten, 11 am dritten. Was in der ersten blind blieb (die Untergrenze der Lesesuche zählte die Importzeilen mit, kein Zeuge fuhr die Neugier mit einem Fremdwert, die Schreibseite hatte keinen Vollständigkeitszeugen, die drei Kopien der Prüfung im KZG waren ungleich bezeugt), ist in der zweiten rot; was in der zweiten blind blieb — eine Säule aus dem Produkt der Neugier gestrichen —, in der dritten. Blind bleiben Formen, die die Suchzeugen nicht sehen, die Richtung je Säule der Neugier, ein Deckel auf ihr Produkt, zwei Lücken am Zeugen der Kopien und eine andere Schreibweise eines Kanon-Werts im KZG (Fundliste, 26.10.2026).
**MESSUNG vor dem Commit** `[gemessen 26.10.2026]`, an Eingaben, die der Betrieb gespeichert hatte, durch den Stand davor und den Bau, nur gezählt: **1817 Turns** mit den Eingaben des EI-Gates auf Novas Seite (27.07. bis 26.10.2026) — der Stand davor reproduziert das protokollierte `arousal_ei` in **1817 von 1817**, der Bau senkt es in **262** (14,4 %), im Mittel um 0,063, höchstens um 0,186, **und hebt es in keinem**; außerhalb ihrer Tabelle lagen `intent` 90-mal und `tone` 176-mal. 29-mal quert der EI-Arousal dabei die Schwelle 0,4 und 13-mal die Schwelle 0,7 der Modus-Plausibilität; ob sich die Korrektur nach `emotional` dort umkehrt, hängt an der Emotionsgruppe des Turns und ist nicht gemessen. In der Neugier (1817 Turns) und in der Faszination (1778 Turns, Felder des Nutzers) ändert sich an diesem Bestand **kein Faktor**; neu sind nur die Fehlerzeilen — 38 für `sprach_stil` und 1 für die Dynamik in der Neugier, 46 für `intent` in der Faszination. Die Prüfungen ergeben in 16 275 Aufrufen genau die Erwartung aus der Mengenzugehörigkeit, samt der Zahl der Fehlerzeilen.
**Im Betrieb nicht gemessen:** nach dem Commit die Fehlerzeilen je Feld gegen die beendeten Turns eines Zeitraums, nach Ort und Turn gezählt. Erwartung aus dem Bestand seit dem 10.09.2026: im EI-Gate `tone` in rund 10 % und `intent` in 1,4 % der Turns, in der Neugier `sprach_stil` in 3,5 %, in der Faszination `intent` in 3,5 % der Turns mit Faszinationsrechnung. Nicht gelaufen ist auch die Messung am Modell über eine zurückgehaltene Reihe von Perzeptionen.
**Was der Bau nicht schließt**, steht als Fund in der Fundliste (26.10.2026): die Ziel- und Deltatabellen ohne Riegel (oben), mehrere Fehlerzeilen je Turn für einen Fremdwert, die Grenzen der Suchzeugen, die Säulen der Neugier je nur in einer Richtung bezeugt und der Zwilling der Faszination ohne Prüfung der Fehlerzeile.
*Zustand bis 26.10.2026:* offen — gegen HEAD `00c16b6` gehalten am 20.08.2026. `ei/berechnung.py:820-821` liest `intent` und `tone` weiter ueber `.get(wert, 1.0)`.
**Befund (18.08.2026), aus der Fundliste uebernommen.** **Drei Felder der Perzeption haben keinen Kanon-Riegel, und der Vorgabewert des Intent ist der höchste Wert seiner Tabelle.** `emotion` bekommt bei einem unbekannten Wert einen Error-Log (`enricher`), `modus` läuft durch `modus_pruefen` — **`sprach_stil`, `intent` und `tone` haben nichts davon.** Alle drei werden über `.get(wert, 1.0)` gelesen, und beim Intent ist 1.0 zugleich der **Maximalwert** der Tabelle (`EI_INTENT_FAKTOREN`: personal 1.0 … knowledge/meta/task 0.3): Ein Wert außerhalb des Kanons wird damit nicht gedämpft, sondern maximal verstärkt — genau die Klasse aus `22_STILLE_FEHLER.md` §7, nur ohne Begleitfeld. Beim Tone liegt der Vorgabewert 1.0 zwischen `sachlich` 0.3 und `empathisch` 1.3, also ebenfalls im oberen Drittel. **Belegt an einem Perzeptionslauf über 49 Turns eines echten Dialogs (16.08.2026, Produktivmodell, gemessen 18.08.2026):** 8 Feldwerte in 7 Turns (14,3 %) liegen außerhalb ihres Kanons — `tone` 5 mal (`nachdenklich` 3×, `spielerisch`, `locker`), `intent` 2 mal, und beide Male mit **`philosophischer_austausch`, einem Wert aus der Modus-Liste**, die im selben Prompt direkt darüber steht; `sprach_stil` einmal (`nachdenklich`). Wirkung auf das EI-Gate, je Turn nachgerechnet: `ei_arousal` liegt um **+0,070 bis +0,122** höher, als der niedrigste kanonische Wert ergäbe. **Warum es niemandem auffiel:** Der Wert ist plausibel — `nachdenklich` als Tonfall liest sich richtig —, und die Rechnung liefert eine Zahl, die niemand als Vorgabewert erkennt. Verwandt mit `PERZEPTION-EMOTION-AUSSER-KANON`, aber eigenständig: Dort gibt es die Meldung und sie wird überhört, hier gibt es sie nicht.
**Entschieden am 15.10.2026, vor dem Bau:** Der Riegel sitzt an der **Verwendungsstelle**, nicht in der Perzeption — sie zieht weiter Schreibvarianten auf den Kanon und lässt einen unbekannten Wert durch, damit er stromabwärts gemeldet wird (Docstring von `_kanonisch`). Die EI-Rechnung nimmt für einen unbekannten Wert einen **neutralen** Faktor, nie den höchsten, mit Fehlerzeile. Gemeinsam mit `KANON-FELDER-NEHMEN-FREMDWERTE`.
**Geschlossen, wenn** Jedes Perzeptionsfeld hat einen Kanon-Riegel, und kein Vorgabewert ist der hoechste Wert seiner Tabelle.
---
### `KANON-FELDER-NEHMEN-FREMDWERTE` — Modus und Intentionen gehen ungeprüft in den KZG ✅
**Kategorie:** CHA
**Rang:** **hoch** — still, schreibt ins Gedächtnis. Durchsicht 05.10.2026, gegen HEAD `17bf86e`: gilt an beiden Feldern; `modus` und `intentionen` gehen ohne Kanonprüfung in den KZG (`server/graph/nodes/salience.py:733-734`, `:770`, `server/memory/kzg.py:344`, `:394`); `MODUS_KANON` und `INTENT_KANON` prüft dort niemand.
**Zustand:** **geschlossen ~~am 26.10.2026~~ → am 05.11.2026 mit dem Commit des Code-Trees `6feb70a` (Kennung wird nachgetragen → committet als `e71df6b`, die Doku dazu als `7b35557`)** — gebaut im selben Zug wie `PERZEPTIONSFELDER-OHNE-KANON` (Eintrag darüber: Stand der Suite und Gegenprobe) —, bezeugt, vor dem Commit an gespeicherten Modellausgaben gemessen, **im Betrieb nicht gemessen**. Erfüllt ist *„Ein Wert ausserhalb des Kanons wird laut abgelehnt, auf beiden Seiten“*: Die drei Schreiber von `modus` und `intentionen` der Salienz in den KZG prüfen beide Felder, für den Nutzer wie für Nova, und vor dem Commit ist es an beiden Seiten gemessen.
**Gebaut** `[Code]` (`server/memory/kzg.py`, `server/agents/kzg/speicher.py`, `server/agents/kzg/queues.py`): `_kanon_felder_pruefen` gibt `modus` nur als Wert aus `MODUS_KANON` weiter, sonst leer, und von den `intentionen` nur die aus `INTENT_KANON`, in ihrer Reihenfolge — je mit einer ERROR-Zeile, die Schreiber, Feld und Wert nennt; ein leerer Modus ist kein Fehler, ein Intentionsfeld, das keine Liste ist, wird laut verworfen. Gerufen in `kzg_store` (Hash und Schatten-Auftrag), in `_neu_anlegen` des KZG-Agenten (Hash) und in `queues_befuellen` (Schatten-Auftrag, erst im Zweig, der einen Auftrag schreibt). Die Prüfung steht wortgleich dreimal, je Verwendungsstelle eine, wie der Bau sie vorgab; ein Zeuge hält die drei Kopien an denselben Eingaben zusammen (Backlog `INTENTION-AUFGABE-MAP-DOPPELT`, Nachtrag vom 26.10.2026). Perzeption und Salienz bleiben durchlässig; der Bestand im KZG ist nicht umgeschrieben.
**Zeugen** `[Test]`: `server/tests/test_kanon_usage.py` — je Schreiber ein fremder Modus leer und nur die fremde Intention verworfen, mit Zwilling (Kanon-Werte unverändert); die drei Kopien mit denselben Eingaben (fremd, im Kanon, leerer Modus, keine Liste) und derselben Erwartung an Rückgabe, Stufe und Feld und Wert der Zeile; die Schreibseite über den Syntaxbaum: Jeder Schreiber von `modus` oder `intentionen` aus der Salienz schreibt den geprüften Wert, die bekannten Stellen genau je Datei (4 / 2 / 2).
**MESSUNG vor dem Commit** `[gemessen 26.10.2026]`, an gespeicherten Modellausgaben, nur gezählt: **2785 Schatten-Aufträge** des Salienzwegs und **4571 LZG-Knoten** (651 des Nutzers, 3920 Novas), je durch alle drei Kopien — **genau die Werte außerhalb werden leer bzw. verworfen, keiner aus dem Kanon**, in 3 × 7356 von 3 × 7356 Aufrufen samt der Zahl der Fehlerzeilen. Außerhalb des Kanons lag der Modus in 211 der 838 nicht leeren Aufträge (25,2 %) und in 452 der 3167 nicht leeren Knoten Novas (14,3 %), beim Nutzer in keinem; verworfen würden 5 und 14 Intentionen. Kein Schatten-Auftrag verlöre seine Aufgabe (0 von 2785). Seit dem 10.09.2026 trifft es noch 32 von 1048 Aufträgen und 43 von 486 Knoten Novas.
**Im Betrieb nicht gemessen:** nach dem Commit die Fehlerzeilen der drei Schreiber je Feld gegen die beendeten Turns, nach Ort und Turn gezählt — auf dem Agentenweg schreiben `speichern` und `queues_befuellen` nacheinander mit derselben Salienz, ein fremder Modus über `KZG_SALIENZ_HIGH` ergibt dort zwei Zeilen. Nicht gemessen ist auch der lebende KZG in Redis; gemessen sind seine Spuren in Schatten-Aufträgen und LZG-Knoten.
**Was der Bau nicht schließt**, steht als Fund in der Fundliste (26.10.2026): Die Delegationsakte schreibt Intentionen und Modus ungeprüft in einen anderen Bestand; eine andere Schreibweise eines Kanon-Werts geht leer in den KZG, und welche Absicht dort gilt, ist offen; die Schreibsuche sieht bestimmte Formen nicht.
*Zustand bis 26.10.2026:* offen, **verschaerft** — am Bestand nachgemessen am 25.08.2026. Der Befund nannte 34 von 399 Werten ausserhalb des Kanons, also 9 %. Heute ueber `shadow_auftrag` gezaehlt: **99 von 464 mit Modus (21,3 %)** — der Anteil hat sich mehr als verdoppelt. Der Kanon zaehlt zehn Werte; im Bestand stehen unter anderem `Informationsabfrage / Lernmodus`, `Spielerisch-emotional` und `Philosophisch-spielerischer Austausch mit hoher metaphorischer Dichte`. **Eine als geduldet gefuehrte Zahl ist keine Konstante.**
**Befund (2026-07-29).** Zwei Kanon-Felder nehmen Werte außerhalb ihres Kanons stillschweigend an, und die Lücke sitzt **nur auf Novas Seite**. Gemessen über 493 KZG-Einträge: Beim `modus` liefert der Nutzer-Pfad **94 von 94** Kanon-Werten, der Assistant-Pfad **365 von 399** — **34 Einträge (9 %) tragen LLM-Freitext** statt eines der zehn Labels, darunter `'Kein Modus etabliert'`, `'theoretische_spezifikation'`, `'Wissensabfrage und fachliche Aufklärung'`; 32 verschiedene Werte insgesamt. Bei `intentionen` dasselbe Muster, kleiner: 2 von 874 Nennungen außerhalb des 16er-Kanons (`philosophischer_austausch`, `spielerisch_interagieren` — beides Modus-Werte im Intentionsfeld, beide von Nova). Die Asymmetrie ist lokalisierbar: `perzeption.task.txt` bindet, `perzeption.assistant_task.txt` nicht. `modus_pruefen` wurde in Chat 114 genau dafür gebaut und meldet `error` — sitzt aber im GV-Pfad; der KZG-Verdichtungs-Pfad, aus dem diese Einträge stammen, ruft es nicht. Der Chat-114-Fund ist damit halb geschlossen. **Verzerrung beachten:** Die Freitexte beschreiben überwiegend Registerwechsel in Prosa — also genau die Fälle, die eine Messung des Registerwegs braucht.
**Was fertig waere.** Ein Wert ausserhalb des Kanons wird laut abgelehnt, auf beiden Seiten.
**Entschieden am 15.10.2026, vor dem Bau:** abgelehnt wird an der **Verwendungsstelle** — ein `modus` ausserhalb von `MODUS_KANON` geht leer in den KZG, eine Intention ausserhalb von `INTENT_KANON` wird verworfen, beides mit Fehlerzeile; nie Freitext in den Bestand. Die Perzeption bleibt durchlaessig und meldet. Gemeinsam mit `PERZEPTIONSFELDER-OHNE-KANON`.
**Prioritaet:** hoch.
---
## 26.10.2026 — behoben und im Betrieb gemessen
**Diese drei Einträge sind mit ihren Commits und einer gemeinsamen Messung im Betrieb geschlossen** — am 26.10.2026 an einem Prüf-Nutzer, über den echten Weg, 9 von 9 Schritten wie Soll; die Zustandszeilen nennen Commit, Zeugen und Messung und was im Betrieb nicht gemessen ist. Im offenen Register standen `ZURUECKHALTUNG-GILT-ALS-ZUSTIMMUNG` und `DIREKTIVEN-KENNUNG-UNGEPRUEFT` im Abschnitt *24.10.2026 — aus der Klassifizierung der Funde vom 24.10.2026*, dessen Einleitung dort stehen bleibt; `DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS` stand allein im Abschnitt *18.10.2026 — beim Abschluss der Ja/Nein-Deutung am Code gefunden*, der dort mit ihm entfällt.
---
### `ZURUECKHALTUNG-GILT-ALS-ZUSTIMMUNG` — an den Ja/Nein-Toren führt eine Antwort, die etwas zurückhält, die erfragte Aktion aus, sobald sie ein Zustimmungswort trägt ✅
**Kategorie:** CHA
**Rang:** **hoch** — still: Das Log meldet eine Zustimmung, keinen Fehler; und es schreibt gegen den Willen, denn wer zurückfragt, aufschiebt oder warten will, hat nicht zugestimmt. Eine Rückfrage auf eine Rückfrage ist eine gewöhnliche Antwort, und an zwei Toren ist die Wirkung groß: Lesezugriff auf ein Verzeichnis des Menschen wird freigegeben, alle Charakter-Anweisungen werden deaktiviert. Vergeben am 24.10.2026 gegen HEAD `2702d94`.
**Zustand:** **geschlossen am 26.10.2026 — behoben mit `e1e0724`** (Code-Tree `f901e08`, die Doku dazu `d2d6ec8`), **im Betrieb gemessen am 26.10.2026 für `direktiven` und `notizen`, über den echten Weg** `[gemessen]`: an einem Prüf-Nutzer, nach dem Commit von `236edec` (`DIREKTIVEN-KENNUNG-UNGEPRUEFT`, in dieser Datei), 9 von 9 Schritten wie Soll. Auf die Bitte, eine frische Direktive über ein wissenschaftliches Thema (Neutronensterne) zu löschen, stellt das Tor die Pflicht-Rückfrage mit der richtigen Kennung; *„Wie bitte?“* und *„ist das ok“* erneuern dieselbe Frage, nichts gelöscht; *„Nein“* beendet sie, nichts gelöscht; erneut erbeten und mit *„ja“* beantwortet, ist die Direktive gelöscht (`aktiv = FALSE`). Im Notizen-Dienst erneuert *„Wie bitte?“* die Frage nach einer nicht gefundenen Notiz, es entsteht keine; *„Nein“* schließt. Fehlerzeilen des Prüf-Nutzers im `pipeline_log`: 0. **Warum geschlossen:** Die Schließbedingung verlangt die geschlossene Annahme an den vier Toren, bezeugt mit einer Rückfrage, einem Aufschub und einer Bitte zu warten, je mit einem Zwilling aus reiner Zustimmung, und die sechs umgedrehten Fälle der alten Zeugen — beides steht seit `e1e0724` (`ClosedConsentTest` in `server/tests/agents/{direktiven,notizen,charakter_identitaet}/test_resume.py`, `GeschlosseneZustimmungTest` in `server/tests/test_dateien_wurzeln.py`; der Aufschub als *„ja, aber erst morgen“*, in den Direktiven auch *„Ja, später“*; die umgedrehten Fälle in `_CONSENT_TWINS` und `HesitationReadingTest.test_minimal_pairs`, am Code von `277879b` gelesen). Die Messung im Betrieb, an die der Zustand unten den Abschluss band, ist gelaufen. **Im Betrieb nicht gemessen sind `charakter_identitaet` und `dateien_wurzeln`:** Dort tragen die Zeugen und die Messung vor dem Commit (305 ungezeigte Antworten, 0 Fehlausführungen) den Abschluss. Im Notizen-Schritt *„Wie bitte?“* brach der Graph an der Rekursionsgrenze ab; der Stand bis dahin wurde ausgeliefert, der Zustand stimmte (Fundliste, 26.10.2026).
*Zustand bis 26.10.2026:* offen — behoben im Code-Tree `f901e08` (24.10.2026, Kennung wird nachgetragen → committet als `e1e0724`, die Doku dazu als `d2d6ec8`), die MESSUNG im Betrieb steht aus. **Im Betrieb gemessen am 24.10.2026, teils** `[gemessen]`: Notizen über den echten Weg bestanden (*„Wie bitte?“* erneuert die Rückfrage, keine Notiz; *„Nein“* schließt); Tor der Direktiven mit gesetzter Rückfrage 4 von 4 (*„Wie bitte?“* und *„ist das ok“* erneuern, *„Nein“* löscht nicht, *„ja“* löscht); der echte Weg zur Frage der Direktiven bricht an `DIREKTIVEN-KENNUNG-UNGEPRUEFT` ab — geschlossen wird dieser Eintrag erst mit der Messung über den echten Weg nach dessen Behebung; Charakter-Identität und Dateien-Wurzeln sind im Betrieb nicht gemessen. **Gebaut:** In den vier `resume.py` führt eine Antwort nur aus, wenn sie aus Zustimmung besteht — jedes Wort ein Zustimmungs- oder Füllwort (`FILLER_WORDS`, geschlossen; *na*, *nun*, *also* und Wörter der Einschränkung oder des Aufschubs nie darin), kein Zeichen außerhalb von `DROPPED_SIGNS` (ASCII-Leerraum und `. , ! ; : - ( )`), kein finites Verb aus `ASKING_VERBS` vor einem Wort aus `SUBJECT_WORDS` im selben Satzteil (`CLAUSE_SEPARATORS`); die Ablehnung wird zuerst geprüft; `WAIT_STEMS` und `_holds_back` entfallen. **Belege:** Zeugen je Dienst — `ClosedConsentTest`, `ClosedSignsTest`, `RefusalFirstTest`, `ExcludedWordsTest`, `WordOrderTest` und `ClauseSeparatorsTest` in `server/tests/agents/{direktiven,notizen,charakter_identitaet}/test_resume.py`, in `server/tests/test_dateien_wurzeln.py` als `GeschlosseneZustimmungTest`, `GeschlosseneZeichenTest`, `AblehnungZuerstTest`, `AusgeschlosseneWoerterTest`, `WortstellungTest` und `TrennzeichenTest`; Server-Suite am Code-Tree `Ran 5394 tests` · `OK (expected failures=2)` (vorher 5276); MESSUNG vor dem Commit `[gemessen 24.10.2026]` an 305 ungezeigten Antworten durch die vier Deutungen, ohne GPU und Datenbank: 0 Fehlausführungen in allen vier Diensten (am Stand davor 33 bis 50 je Dienst), Nachprobe der Wortstellung 14 von 14 unklar. **Geschlossen mit** der MESSUNG im Betrieb an einem Prüf-Nutzer, zusammen mit `DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS`: eine Direktive über ein wissenschaftliches Thema, ihr Löschen erbeten — *„Wie bitte?“* → dieselbe Frage, nichts gelöscht; *„Nein“* → nichts gelöscht; *„ja“* → gelöscht; im Notizen-Dienst eine nicht vorhandene Notiz ergänzen lassen — *„Wie bitte?“* → keine Notiz. **Preis**, nicht gemessen: *„ja 👍“*, *„Ja…“*, *„ja – gerne“*, *„na klar“*, *„gut, ja“* und *„auf jeden Fall“* fragen ein zweites Mal. **Davor:** offen — am Code gelesen am 24.10.2026 gegen `2702d94`, die Deutungsfunktionen an Sätzen nachgerechnet, ohne Datenbank; kein Graph lief, im Betrieb nicht beobachtet. **Entschieden am 24.10.2026, nicht gebaut:** An allen vier Ja/Nein-Toren führt eine Antwort nur aus, wenn sie aus Zustimmung besteht — eine geschlossene Klasse statt einer Liste dessen, was zurückhält; ein `?` bleibt eigens zurückhaltend, sonst führte *„Ja?“* aus, das bei den Direktiven seit `6846120` unklar ist. Die Deutung bleibt eine Kopie je Dienst, bis der geschlossene Leser der Klärfälle sie ablöst (`KLA-KLAERFALL-AM-OBJEKT`, Schritte 5 und 6).
**Befund** `[Code]`, an vier Toren, die je eine eigene Kopie der Deutung tragen:
- **Notizen:** `server/agents/notizen/resume.py::_resume_nicht_gefunden` (Z. 276–333) prüft zuerst die Ablehnung (Z. 293), dann die Zustimmung als ganzes Wort aus `CONSENT_WORDS` (Z. 304; darin *bitte*). Bei Zustimmung setzt es `action` `create` und `status` `laufend`, und `agent.py::_nach_resume` (Z. 163–176) geht nach `ausfuehren`: Auf die Frage, ob eine nicht gefundene Notiz angelegt werden soll, legt *„Wie bitte?“* sie an. Den Fragetext formt der Responder (`responder.aufgabe_rueckfrage`); was der Mensch liest, ist *unbelegt*.
- **Charakter-Identität:** `server/agents/charakter_identitaet/resume.py::_standard_interpretieren` (Z. 195–229) kennt keine Zurückhaltung; *bitte* steht in `CONSENT_WORDS` (Z. 34–38). *„Wie bitte?“* ergibt `bestaetigt`, `resume` gibt `laufend` (Z. 77–85), und `agent.py::_nach_resume` (Z. 127–131) geht mit der erfragten Aktion nach `ausfuehren`. Ohne Kennung lautet die Frage zum Löschen *„Soll ich das ausfuehren? Charakter-Anweisung loeschen (alle)“* (`crud.py`, Z. 160–163, 172); `_delete` führt dann zu `_delete_alle` (Z. 360–365, 390–420), und **alle aktiven Charakter-Anweisungen werden deaktiviert**. Auf *„… Charakter komplett ersetzen durch: '…'“* (Z. 165) läuft `_replace`.
- **Dateien-Wurzeln:** `server/agents/dateien_wurzeln/resume.py::_antwort_deuten` (Z. 239–258) sucht die Zustimmung als ganzes Wort (`_traegt`; *bitte* in Z. 40). *„Wie bitte?“* ergibt `bestaetigt`, dann `laufend` (Z. 175–182) und `ausfuehren`: Auf *„Ich habe … unter … gefunden — dieses Verzeichnis … freigeben?“* (`crud.py`, Z. 293–298) wird die Freigabe angelegt — **Lesezugriff auf ein Verzeichnis des Menschen**, nach dem Modul-Docstring (Z. 11–14) der teuerste Fehler des Verbunds. Die Frage nach dem Eigentümer ist sicher: *„Wie bitte?“* trägt kein Eigentumswort, und `_eigentum_beantworten` fragt erneut (Z. 210–224).
- **Direktiven:** `server/agents/direktiven/resume.py::_reading` (Z. 190–224) prüft die Ablehnung, dann ~~`_holds_back` (Z. 161–187: ein `?` an irgendeiner Stelle oder ein Stamm aus `WAIT_STEMS`, Z. 57)~~ → seit dem Code-Tree `f901e08` (24.10.2026) entfallen `_holds_back` und `WAIT_STEMS`: ein `?` an irgendeiner Stelle macht die Antwort unklar wie jedes andere Zeichen außerhalb von `DROPPED_SIGNS`, dann die Zustimmung als ganzes Wort. Die Klasse der Zurückhaltung ist damit offen: Was weder ein `?` noch einen Stamm trägt, führt neben einem Zustimmungswort aus, über `read_answer` (Z. 310–315) und `agent.py::_nach_deutung` (Z. 139–149) nach `ausfuehren`. Auf *„Soll ich das ausfuehren? Direktive loeschen (ID …)“* setzt `_delete` dann `aktiv = FALSE` (`crud.py`, Z. 408–411) — weich, über `reactivate` rückholbar.
`[gemessen 24.10.2026]` an den Deutungsfunktionen, ohne Datenbank: *„Wie bitte?“*, *„Ja?“*, *„Ja? :)“*, *„Moment, bitte“*, *„Kurz warten, bitte“*, *„Bitte?“* und *„hä? ok“* sind in `notizen`, `charakter_identitaet` und `dateien_wurzeln` Zustimmung, bei den Direktiven unklar. Bei den Direktiven sind *„Sekündchen, bitte“* und *„Sek, bitte“* (*sekunde* steckt nicht in *sekünd-* oder *sek*), *„wait, ok“* und *„hold on, ok“* (englisches Warten fehlt), *„Ja, später“*, *„ok, ich überleg noch“* und *„ja, aber erst morgen“* (Aufschub ohne Stamm) und *„Wie bitte!“* ohne `?` Zustimmung. Keine dieser Antworten trägt eine Auftragsform; der Router reicht sie als Wiederaufnahme durch (`utils/offers.py::carries_own_request` ist `False`).
**Wirkung.** Auf eine Rückfrage, eine Bitte um Aufschub oder eine Bitte zu warten führt der Dienst die erfragte Aktion aus: Er legt eine Notiz an, deaktiviert eine oder alle Charakter-Anweisungen oder ersetzt den Charakter, gibt ein Verzeichnis zum Lesen frei oder löscht eine Direktive. Das Ergebnis meldet die Ausführung wie nach einem Ja.
**Zeugen, die das Verhalten zusicherten** `[Code]` — ~~am Stand `2702d94`~~ → seit `f901e08` umgedreht (`_CONSENT_TWINS` trägt echte Zustimmung, *„passt es“* ist unklar): `server/tests/agents/direktiven/test_resume.py`, `_CONSENT_TWINS` (Z. 58–60), trägt *„Kurz, bitte“* und *„Wie bitte!“* als Zwillinge von *„Kurz warten, bitte“* und *„Wie bitte?!“*, und `test_plain_consent_executes` (Z. 399–408) verlangt über den Graphen, dass beide löschen. `HesitationReadingTest.test_minimal_pairs` (Z. 414–439) hält an `_reading` dazu *„Wie bitte“* ohne Satzzeichen, *„was meinst du, ja“*, *„Kurz, bitte“* und *„Wie bitte!“* als Zustimmung fest — sechs Fälle in zwei Testmethoden. Mit der Behebung werden sie umgedreht: Die Zwillinge tragen dann echte Zustimmung (*„Ja, bitte!“*), und der Beleg *„Wie bitte!“* unter *Getestet* von `DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS` und in [`novaberg-agent-directives.md`](novaberg-agent-directives.md) §3 ist zu berichtigen.
**Hinweis für die Messung** `[Code]` — ~~Die Stämme des Wartens~~ → seit dem Code-Tree `f901e08` (24.10.2026) gegenstandslos, `WAIT_STEMS` entfällt; die Wörter *verhalten*, *einhalten*, *erwarte*, *augenblicklich* neben *ja* sind weiter unklar, weil *ja* mit einem Wort außerhalb der Menge nicht zustimmt. Der Stand davor: Die Stämme des Wartens suchen als Teilzeichenkette (`direktiven/resume.py`, Z. 124). *verhalten*, *einhalten*, *erwarte*, *augenblicklich*, *behalten*, *Inhalt*, *gewartet* und *momentan* neben *ja* sind unklar und kosten eine zweite Frage — die gewollte Richtung, zu weit statt zu eng (Kommentar Z. 49–56; [`novaberg-agent-directives.md`](novaberg-agent-directives.md) §3); geschrieben wird nichts. Bezeugt ist nur *momentan*. Eine Messung im Betrieb, die zweite Fragen zählt, findet sie häufiger als bei *halt* als Partikel; die MESSUNG von `DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS` antwortet mit *„Ja“* und *„Nein“* und trifft keinen Stamm. Nach der geschlossenen Regel entscheiden die Stämme nichts mehr.
**Geschlossen, wenn** an den vier Ja/Nein-Toren (`notizen`, `charakter_identitaet`, `dateien_wurzeln`, `direktiven`) eine Antwort nur ausführt, wenn sie aus Zustimmung besteht — bezeugt mit einer Rückfrage (*„Wie bitte?“*), einem Aufschub (*„Ja, später“*) und einer Bitte zu warten (*„Moment, bitte“*), je mit einem Zwilling aus reiner Zustimmung —, und die sechs Fälle der Zeugen oben umgedreht sind.
**Offen:** welche Wörter neben den Zustimmungswörtern stehen dürfen (*danke*, *das*, *mach das*). Der Preis der geschlossenen Klasse: *„Ja, mach das“* und *„ja, danke“* fragen ein zweites Mal. *„Ja, lösch sie“* erreicht das Tor gar nicht — `carries_own_request` trifft *lösch*, und der Router verwirft den Wartezustand und routet neu (`graph/nodes/router.py`, Z. 260–274). Wie oft solche Antworten vorkommen, ist nicht gezählt.
**Zusammenhang:** `ABLEHNUNG-OHNE-STAMM-BESTAETIGT` und `WURZELN-ABLEHNUNG-UNGELESEN` (Archiv, [`novaberg-bugs-archiv-charakter.md`](novaberg-bugs-archiv-charakter.md)) — dieselben Tore, die andere Klasse, eine Ablehnung ohne Stamm neben einem Zustimmungswort; eine Antwort, die nur aus Zustimmung bestehen darf, um auszuführen, schließt beide mit. `NOTIZ-VERNEINUNG-UEBERLESEN` ([`novaberg-bugs-wissen.md`](novaberg-bugs-wissen.md)) — Duplikat und Wahl der Notizen. `ZUSTIMMUNG-GILT-ALS-ABLEHNUNG` (Archiv, [`novaberg-bugs-archiv-charakter.md`](novaberg-bugs-archiv-charakter.md)) — die Gegenrichtung. `DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS` (in dieser Datei) nennt die Lücke der Direktiven als *Grenze*; seine Schließbedingung deckt diesen Eintrag nicht.
---
### `DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS` — auf die Pflicht-Rückfrage der Direktiven führt auch ein Nein aus ✅
**Kategorie:** CHA
**Rang:** **hoch** — still, gegen den Willen des Menschen, und es schreibt: Wer die Rückfrage verneint, löst die Aktion aus, nach der gefragt wurde. Vergeben am 18.10.2026 gegen HEAD `ae05667`.
**Zustand:** **geschlossen am 26.10.2026 — behoben mit `6846120`** (Code-Tree `2457549`, die Doku dazu `2702d94`; die Deutung seit `e1e0724` als geschlossene Annahme, `ZURUECKHALTUNG-GILT-ALS-ZUSTIMMUNG`, in dieser Datei), **im Betrieb gemessen am 26.10.2026 über den echten Weg** `[gemessen]`: An einem Prüf-Nutzer mit einer frischen Direktive über ein wissenschaftliches Thema erreicht die Bitte zum Löschen die Pflicht-Rückfrage mit der richtigen Kennung; *„Nein“* → kein Wartezustand mehr, die Direktive bleibt aktiv; erneut erbeten, Zwilling *„ja“* → gelöscht (`aktiv = FALSE`); gezählt an der Tabelle `direktiven` und am Wartezustand nach jedem Schritt, Teil einer Reihe von 9 Schritten, 9 von 9 wie Soll. **Warum geschlossen:** Die Schließbedingung — eine Antwort am Tor der Direktiven wird gedeutet, und eine Ablehnung führt nichts aus — ist bezeugt (`server/tests/agents/direktiven/test_resume.py`) und im Betrieb gemessen. **Abweichungen von der Messvorschrift im Zustand unten:** Die Direktive ist für die Messung in der Datenbank angelegt worden, nicht im Chat mit *„Ja“* auf die Rückfrage; die Fragen *„… Trotzdem anlegen?“* und die nach dem Wiederherstellen sind im Betrieb nicht gemessen. Den Ausgang zählt die Messung am Wartezustand und an der Tabelle, nicht am `pipeline_log` — dort steht eine Ablehnung wie ein Löschen als `abgeschlossen` (`TOR-ABLEHNUNG-MELDET-ABGESCHLOSSEN`, offen, [`novaberg-bugs-charakter.md`](novaberg-bugs-charakter.md)).
*Zustand bis 26.10.2026:* offen — behoben im Code-Tree `2457549` (24.10.2026, Kennung wird nachgetragen → committet als `6846120`, die Doku dazu als `2702d94`; der Serverteil ist `b50981b` auf `6b37234`), geschlossen mit der MESSUNG im Betrieb: an einem Prüf-Nutzer eine Direktive über ein wissenschaftliches Thema anlegen lassen (Rückfrage, *„Ja“*), ihr Löschen erbitten und mit *„Nein“* antworten — gezählt in `direktiven` vorher und nachher und am Ausgang —, Zwilling: Löschen mit *„Ja“*. Der Ausgang steht im `pipeline_log` nicht als Feld: In der Zeile mit `node = 'agent_dispatch'` und `quelle = 'direktiven'` ist `inhalt->>'status'` nach einer Ablehnung `abgeschlossen` wie nach einem Löschen, zu lesen ist sie nur am Text in `inhalt->>'ergebnis'` (Fundliste, 24.10.2026 → `TOR-ABLEHNUNG-MELDET-ABGESCHLOSSEN`). **Im Betrieb gemessen am 24.10.2026, teils** `[gemessen]`: Notizen über den echten Weg bestanden (*„Wie bitte?“* erneuert die Rückfrage, keine Notiz; *„Nein“* schließt); Tor der Direktiven mit gesetzter Rückfrage 4 von 4 (*„Wie bitte?“* und *„ist das ok“* erneuern, *„Nein“* löscht nicht, *„ja“* löscht); der echte Weg zur Frage der Direktiven bricht an `DIREKTIVEN-KENNUNG-UNGEPRUEFT` ab — geschlossen wird dieser Eintrag erst mit der Messung über den echten Weg nach dessen Behebung; Charakter-Identität und Dateien-Wurzeln sind im Betrieb nicht gemessen. **Gebaut:** Ein neuer Knoten `read_answer` (`server/agents/direktiven/resume.py`) deutet die Antwort, bevor etwas ausgeführt wird: `_nach_validierung` geht mit `resume` nach `read_answer` statt nach `ausfuehren`, und `_nach_deutung` geht nur bei `status` `laufend` weiter nach `ausfuehren` (`server/agents/direktiven/agent.py`). Die Deutung (`_reading`) prüft zuerst die **Ablehnung** — Stämme aus `REFUSAL_STEMS` als Teilzeichenkette, gesucht im Text ohne die Zustimmungswörter —, und sie gewinnt, gleich wo sie steht (*„ja, aber lieber nicht“*): `status` `abgeschlossen`, *„Gut, dann lasse ich es. An deinen Direktiven ist nichts geaendert.“*, Schritt `abgelehnt`, nichts ausgeführt. ~~**Unklar** ist danach jede Antwort, die etwas zurückhält (`_holds_back`): ein `?` an irgendeiner Stelle oder ein Stamm des Wartens (`WAIT_STEMS`: `wart`, `moment`, `augenblick`, `sekunde`, `halt`, auch mitten im Wort)~~ → seit dem Code-Tree `f901e08` (24.10.2026) entfallen `_holds_back` und `WAIT_STEMS`; **unklar** ist jede Antwort, die nicht aus Zustimmung besteht (Zustimmungs- und Füllwörter, feste Zeichen, keine Frage nach der Wortstellung) — dieselbe Frage noch einmal, `status` `rueckfrage`, Schritt `unklar`, und `dispatch._handle_resume` erneuert den Pending-Zustand. Sonst führt eine **Zustimmung** (ganze Wörter aus `CONSENT_WORDS`) die erfragte Aktion aus. Das gilt für alle drei Ja/Nein-Fragen — die Pflicht-Rückfrage, *„… Trotzdem anlegen?“* und die Frage nach dem Wiederherstellen; ein Nein auf die dritte legt auch keine neue an. **Eine Auswahlfrage führt nie aus:** Eine Ablehnung beendet sie, jede andere Antwort stellt sie erneut (Schritt `auswahl_offen`); vorher ging jede Antwort nach `ausfuehren`, und blieb inzwischen genau ein Treffer, wurde er ohne Wahl wiederhergestellt oder gelöscht. Die Art der Frage erkennt `_question_kind` am Wortlaut, den der Mensch gesehen hat (`original_rueckfrage`); eine Frage keiner bekannten Form ergibt `fehler` und führt nichts aus. Die Ausgabe-Verifikation von `read_answer` hält jede Ausführung ohne Zustimmung an, auch mit Ablehnungsstamm oder Zurückhaltung (`RuntimeError`). Wortlisten und Helfer sind Kopien aus `server/agents/notizen/resume.py`, ohne gemeinsames Modul; die Zurückhaltung weicht davon ab und sagt im Kommentar, warum. **Grenze:** ~~Die Regel ist absichtlich zu weit — *„Ja? Ja!“*, *„dann halt“* und *momentan* fragen ein zweites Mal —, und Formen der Zurückhaltung, die kein Stamm trifft, führen weiter aus (Fundliste, 24.10.2026 → `ZURUECKHALTUNG-GILT-ALS-ZUSTIMMUNG`)~~ → seit dem Code-Tree `f901e08` führen Formen der Zurückhaltung nicht mehr aus (`ZURUECKHALTUNG-GILT-ALS-ZUSTIMMUNG`, im Betrieb nicht gemessen), *„Ja? Ja!“* und *„dann halt“* fragen weiter ein zweites Mal; ~~eine Ablehnung ohne Stamm neben einer Zustimmung ebenso (`ABLEHNUNG-OHNE-STAMM-BESTAETIGT`)~~ → seit `f901e08` ebenfalls unklar, im Betrieb nicht gemessen. **Getestet:** `server/tests/agents/direktiven/test_resume.py`, 35 Testmethoden, 18 über den Graphen (`DirektivenAgent().invoke` mit `resume`, `dispatch._handle_resume`), Speicher, Redis und Registry gedoppelt: die Schließbedingung (*„Nein“* auf die Pflicht-Rückfrage zu `delete` löscht nichts, Zwilling *„Ja“* löscht); je Frage eine Ablehnung mit ihrem Zwilling und gemischt in beiden Reihenfolgen (*„lieber nicht“*, *„nein danke“*, *„bitte nicht“*, *„ja, aber lieber nicht“*, *„okay, doch nicht“*); die Fälle des Archivs (*„ja, gerne“* und *„meinetwegen“* führen aus, *„ne“* und *„nein, bitte nicht“* nicht); unklar mit Zwilling, der sich nur im zurückhaltenden Teil unterscheidet (*„Wie bitte?!“*/*„Wie bitte!“*, *„Ja? :)“*/*„Ja :)“*, *„Bitte warten“*/*„Bitte“*, *„Sekunde, bitte“*/*„Okay, bitte“*), samt erneuertem Pending; die Auswahlfrage; die Art der Frage an den echten Fragetexten; die Ausgabe-Verifikation. Server-Suite am `b50981b` `Ran 5244 tests` · `OK (expected failures=2)` (`labor/2026-10-24_direktiven_n4_suite.txt`). **Gegenprobe:** Eine erste fand einen blinden Zeugen — *wer zuerst im Text steht, gewinnt* statt *die Ablehnung gewinnt* machte keinen rot — und eine ungezeugte Ausgabe-Verifikation (`labor/2026-10-24_direktiven_gegenprobe.txt`); nach den Zeugen dazu 3 von 3, danach 3 von 3 und 4 von 4 Eingriffen wie vorhergesagt (`labor/2026-10-24_direktiven_n2_gegenprobe.txt`, `…_n3_…`, `…_n4_…`). Davor: offen — am Code gelesen am 18.10.2026 gegen HEAD `ae05667`, nicht gemessen.
**Befund** `[Code]`: Der Direktiven-Dienst fragt vor jeder Schreiboperation nach (`server/agents/direktiven/crud.py::validieren_gegen_db`): *„Soll ich das ausfuehren? …“* für `create`, `update`, `delete` und `reactivate` (Z. 167–180, der Text in Z. 179), dazu *„… Trotzdem anlegen?“* neben einer ähnlichen aktiven Direktive (Z. 117) und *„… Soll ich die wiederherstellen statt eine neue anzulegen?“* neben einer gelöschten (Z. 128). Die Antwort kommt über den Rückweg zurück: `dispatch.py::_handle_resume` setzt `resume: True` und `user_answer`, und der Graph geht mit `resume` ohne jede Deutung nach `ausfuehren` (`server/agents/direktiven/agent.py::_nach_validierung`, Z. 109–110). Einen Resume-Knoten hat der Dienst nicht; `user_answer` steht im Ordner `agents/direktiven/` nur im Dispatch.
**Wirkung.** *„Nein“* auf *„Soll ich das ausfuehren? Direktive loeschen (ID …)“* löscht die Direktive. Auf *„Trotzdem anlegen?“* legt ein Nein die ähnliche Direktive an, auf die Frage nach dem Wiederherstellen stellt es die gelöschte wieder her. Das Ergebnis meldet die Ausführung wie nach einem Ja: Die Rückfrage bietet eine Wahl an, die es im Code nicht gibt.
**Herkunft.** Die Featureliste hielt am 21.08.2026 fest, dass der Dienst keine Wortliste trägt, und las das als Entwarnung für `ZUSTIMMUNG-GILT-ALS-ABLEHNUNG`. Ohne Deutung gibt es aber auch kein Nein. Gefunden am 18.10.2026 beim Abschluss jenes Eintrags.
**Geschlossen, wenn** eine Antwort am Tor der Direktiven gedeutet wird und eine Ablehnung nichts ausführt.
---
### `DIREKTIVEN-KENNUNG-UNGEPRUEFT` — die Kennung aus der Modellausgabe geht ungeprüft an die Schreibwege, und das Löschen, Ändern und Wiederherstellen per Chat bricht ab ✅
**Kategorie:** CHA
**Rang:** **hoch** — Löschen, Ändern und Wiederherstellen einer Direktive per Chat brechen im Betrieb laut ab, sobald das Modell die Kennung in der Form der gezeigten Liste zurückgibt (*„[13]“*, gemessen 2 von 2 an einem Prüf-Nutzer am 24.10.2026); und eine Kennung aus der Modellausgabe geht ungeprüft und ohne Bindung an den Menschen an die Schreibwege — eine falsche Zahl träfe die Direktive eines anderen Menschen (am Code gelesen, nicht gelaufen). Vergeben am 25.10.2026 gegen HEAD `11c139d`.
**Zustand:** **geschlossen am 26.10.2026 — behoben mit `236edec`** (Code-Tree `2876b85`, die Doku dazu `b22e3e8`), **im Betrieb gemessen am 26.10.2026** `[gemessen]`: An einem Prüf-Nutzer mit einer frischen Direktive erreicht die Bitte zum Löschen über die echte Klassifikation die Pflicht-Rückfrage mit der richtigen Kennung (*„Soll ich das ausfuehren? Direktive loeschen (ID 14)“*, 14 die Kennung der frischen Direktive); auf *„ja“* ist sie gelöscht; Fehlerzeilen des Prüf-Nutzers im `pipeline_log`: 0. Am 24.10.2026 brach derselbe Weg vor der Frage ab, weil `"[13]"` ungeprüft an SQL ging. **Warum geschlossen:** Die Schließbedingung hat drei Teile, und alle stehen — die geprüfte Kennung und die Bindung an den Menschen in `direktiven` und `charakter_identitaet`, bezeugt je Aktion (`delete`, `update`, `reactivate`) mit einem Zwilling (`server/tests/test_target_id_ownership.py`: `PathToQuestionTest`, `OwnershipTest`, `BindingTest`); die Messung am Modell (25.10.2026, 54 Bitten, 0 Werte ungeprüft weitergegeben); die Messung im Betrieb mit einer Bitte zum Löschen in `direktiven`. **Im Betrieb nicht gemessen:** `charakter_identitaet` und eine fremde oder unlesbare Kennung; beides tragen die Zeugen.
*Zustand bis 26.10.2026:* offen — behoben im Code-Tree `2876b85`, nicht committet → committet als `236edec`, die Doku dazu als `b22e3e8`; die MESSUNG im Betrieb steht aus. Am Code gelesen gegen `11c139d` und im Betrieb am 24.10.2026 gemessen (die Form der Kennung). **Gebaut** `[Code]` in `direktiven` und `charakter_identitaet`: `klassifikation.py::_read_target_id` liest die Kennung nur als JSON-Ganzzahl größer 0 oder als Schreibweise der Liste (`"13"`, `"[13]"`, Leerraum außen); jeder andere Wert endet laut mit Status `fehler`, Schritt `kennung_unlesbar`, ohne Lesen, Schreiben oder Frage; `null` bleibt der Weg über das Stichwort. `crud.py::validieren_gegen_db` nimmt eine Kennung nur für eine Zeile dieses Menschen im passenden Zustand an (aktiv für `delete` und `update`, inaktiv für `reactivate`), eine fremde und eine fehlende Zeile tragen denselben Grund; `_read_by_id`, `_verifizieren` und der eine UPDATE-Weg `_zustand_setzen` tragen `user_id` in der Bedingung; ein Schreibweg, der nicht genau eine Zeile trifft, endet laut (`keine_zeile`), `update` legt dann nichts an. Zeugen: `server/tests/test_target_id_ownership.py` (neu; darin ein Zeuge nach dem Kriterium über alle kurzen Zeichenfolgen eines Alphabets), angepasst `server/tests/agents/direktiven/test_resume.py` und `server/tests/test_vorher_spur.py`; Server-Suite `Ran 5421 tests` · `OK (expected failures=2)`. **MESSUNG vor dem Commit am Modell** `[gemessen 25.10.2026]`: 54 Bitten (27 × 2) zum Löschen, Ändern und Wiederherstellen und Aktionen ohne Ziel, durch beide Dienste — 0 Werte ungeprüft weitergegeben, 34 von 34 gelesenen Kennungen gleich der gemeinten; Formen der Kennung: Ganzzahl 22, `"[n]"` 12, `null` 16, `"ID n"` 0. Die 12 Antworten `"[n]"` wären vor dem Bau an SQL gescheitert. **Offen bis zur MESSUNG im Betrieb:** eine Bitte zum Löschen erreicht die Pflicht-Rückfrage (in `direktiven`).
**Befund** `[gemessen 24.10.2026]`: An einem Prüf-Nutzer mit einer Direktive (Kennung 13) endete *„Lösche bitte die Direktive über die Hubble-Konstante.“*, zweimal gefragt, ohne Wartezustand, ohne Rückfrage und ohne Löschung. Im Log `ki_server.agent_dispatch: InvalidTextRepresentation: Agent-Dispatch Fehler für 'direktiven'` mit `invalid input syntax for type integer: "[13]"`, aus `crud.py::validieren_gegen_db` über `_read_by_id`. Die Klassifikation zeigt dem Modell die Direktiven als ` [{id}] {anweisung}` (`klassifikation.py`, Z. 92 und 98), und das Modell gibt `[13]` als `target_id` zurück; `ergebnis.get("target_id")` (Z. 153) geht ohne jede Prüfung weiter. Der Mensch bekommt keine Rückfrage, und die Pflicht-Rückfrage vor dem Löschen wird nie erreicht.
**Befund** `[Code]`: Die Kennung ist an keiner Stelle an den Menschen gebunden. `_read_by_id` (`crud.py`, Z. 43–50) liest `WHERE id = %s` ohne `user_id`; `validieren_gegen_db` prüft mit ihr bei `delete` (Z. 134) und `reactivate` (Z. 143), und `_verifizieren` (Z. 195) liest ebenso. Die Schreibwege tragen den Menschen nicht in die Bedingung: `_update` (Z. 338) und `_delete` (Z. 409) setzen `UPDATE direktiven SET aktiv = FALSE … WHERE id = %s`, `_reactivate` (Z. 468) `SET aktiv = TRUE … WHERE id = %s`, jeweils nach einem `_read_by_id` ohne `user_id` (Z. 335, 406, 465). Liefert das Modell eine Zahl, die zu einer Direktive eines anderen Menschen gehört, findet die Validierung sie, die Rückfrage nennt sie, und der Schreibweg ändert sie. Die Stichwortwege (`_suche_by_keyword`, `_suche_inaktive_by_keyword`) binden dagegen an `user_id`.
**Befund, zweiter Teil** `[Code]`, im Betrieb nicht gemessen: Dasselbe Muster steht in `charakter_identitaet`. `klassifikation.py` zeigt dem Modell die Anweisungen als ` [{id}] {anweisung}` (Z. 104 und 109) und übernimmt `ergebnis.get("target_id")` ungeprüft (Z. 163); die Schreibwege in `crud.py` setzen `UPDATE charakter_anweisungen SET aktiv = … WHERE id = %s` ohne `user_id` (Z. 327, 370, 464). Ob das Modell dort `[13]` zurückgibt, ist nicht gemessen. **Vorbild für die Prüfung:** `dateien_wurzeln/klassifikation.py::_ziffer_oder_nichts` liest die Kennung der Modellausgabe schon geprüft (Ganzzahl oder ausdrücklich keine).
**Wirkung.** Ohne die richtige Form bricht der Weg ab, ehe die Rückfrage gestellt wird; mit einer fremden Zahl träfe er die Direktive eines anderen Menschen. Zugleich ist die Messung der Ja/Nein-Tore der Direktiven über den echten Weg nicht möglich: Sie erreicht die Pflicht-Rückfrage nicht.
**Geschlossen, wenn** in `direktiven` und `charakter_identitaet` die Kennung aus der Modellausgabe vor jedem Lesen und Schreiben geprüft wird — in der Form, die die Liste zeigt, lesbar, und nur gültig, wenn sie zu einer Direktive dieses Menschen gehört, die die Aktion betreffen kann; jede andere Kennung endet laut, ohne Schreibung und ohne Frage nach einem fremden Ziel; die Schreibwege binden die Zeile an den Menschen — bezeugt je Aktion (`delete`, `update`, `reactivate`) mit einem Zwilling; gemessen am Modell mit einer Reihe von Bitten und im Betrieb: eine Bitte zum Löschen erreicht die Pflicht-Rückfrage (in `direktiven`).
**Zusammenhang:** `DIREKTIVEN-RUECKFRAGE-OHNE-ZIEL` (offen, [`novaberg-bugs-charakter.md`](novaberg-bugs-charakter.md)) — dort fehlt die Kennung, hier ist sie falsch geformt oder fremd. `DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS` (in dieser Datei) — seine Messung über den echten Weg ist damit blockiert. → Am 26.10.2026 gelaufen, beide geschlossen.
---
## 25.10.2026 — behoben mit Zeugen, im Betrieb teils gemessen
**Diese Einträge sind mit einem Bau geschlossen, dessen Schließbedingung Zeugen verlangt, keine Messung im Betrieb.** Ob die Dienste im Betrieb halten, steht in der Zustandszeile je Eintrag und in `ZURUECKHALTUNG-GILT-ALS-ZUSTIMMUNG` (~~[`novaberg-bugs-charakter.md`](novaberg-bugs-charakter.md)~~ → seit dem 26.10.2026 geschlossen, im Abschnitt darüber).
---
### `ABLEHNUNG-OHNE-STAMM-BESTAETIGT` — eine Ablehnung ohne Stamm aus der Liste bestätigt neben einem Zustimmungswort
**Kategorie:** CHA
**Rang:** **mittel** — still, und es schreibt gegen den Willen; die Sätze sind selten. Vergeben am 20.10.2026 gegen HEAD `b52e919`; beide Dateien sind seit `2c64856` unverändert.
**Zustand:** **geschlossen am 25.10.2026 — behoben mit `e1e0724`** (Code-Tree `f901e08`, die Doku dazu `d2d6ec8`): *„ja, vergiss es“*, *„ok nö“* und *„bitte niemals“* bestehen nicht aus Zustimmungs- und Füllwörtern und sind unklar, ohne dass die Liste der Ablehnungsstämme wächst. **Belege:** Zeugen je Dienst — `ClosedConsentTest`, `ClosedSignsTest`, `RefusalFirstTest`, `ExcludedWordsTest`, `WordOrderTest` und `ClauseSeparatorsTest` in `server/tests/agents/{direktiven,notizen,charakter_identitaet}/test_resume.py`, in `server/tests/test_dateien_wurzeln.py` als `GeschlosseneZustimmungTest`, `GeschlosseneZeichenTest`, `AblehnungZuerstTest`, `AusgeschlosseneWoerterTest`, `WortstellungTest` und `TrennzeichenTest`; Server-Suite am Code-Tree `Ran 5394 tests` · `OK (expected failures=2)` (vorher 5276); MESSUNG vor dem Commit `[gemessen 24.10.2026]` an 305 ungezeigten Antworten durch die vier Deutungen, ohne GPU und Datenbank: 0 Fehlausführungen in allen vier Diensten (am Stand davor 33 bis 50 je Dienst), Nachprobe der Wortstellung 14 von 14 unklar. **Warum geschlossen:** Die Schließbedingung verlangt Zeugen, keine Messung im Betrieb; sie ist erfüllt. Die drei Sätze sind je Dienst bezeugt (`ClosedConsentTest` in `server/tests/agents/{direktiven,notizen,charakter_identitaet}/test_resume.py`), Suite `Ran 5394 tests` · `OK (expected failures=2)`. Im Betrieb ist das Tor der Direktiven mit gesetzter Rückfrage gemessen (24.10.2026, 4 von 4) und das der Notizen über den echten Weg; Charakter-Identität ist im Betrieb nicht gemessen. Der Rest der Klasse, die Zurückhaltung, bleibt offen in `ZURUECKHALTUNG-GILT-ALS-ZUSTIMMUNG`. → Geschlossen am 26.10.2026, im Betrieb gemessen für `direktiven` und `notizen` (oben). **Davor:** offen — gemessen am 18.10.2026 an den Deutungsfunktionen, aufgerufen ohne Datenbank, gefunden beim Nachzug zu `ZUSTIMMUNG-GILT-ALS-ABLEHNUNG`.
**Befund** `[gemessen 18.10.2026]`: In `charakter_identitaet` (`resume.py::_standard_interpretieren`) und `notizen` (`resume.py::_resume_nicht_gefunden`) kennt die Ablehnung nur die Stämme aus `REFUSAL_STEMS` (`nein`, `ne`, `nee`, `nicht`, `kein`, `lass`, `abbruch`, `abbrech`, `stopp`, `stop`). *„vergiss es“*, *nö* und *niemals* trägt keiner davon. Allein bleiben sie unklar, und es wird erneut gefragt; neben einem Zustimmungswort bestätigen sie: *„ja, vergiss es“*, *„ok nö“* und *„bitte niemals“* ergeben Zustimmung bzw. Anlegen, in beiden Diensten.
**Nachtrag, 24.10.2026 — derselbe Befund am Tor der Direktiven** `[Code]`: Die Deutung, die mit dem Code-Tree `2457549` für `DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS` gebaut ist (`server/agents/direktiven/resume.py::_reading`), kopiert `REFUSAL_STEMS` und `CONSENT_WORDS` aus `notizen`. *„ja, vergiss es“*, *„ok nö“* und *„bitte niemals“* auf *„Soll ich das ausfuehren? Direktive loeschen (ID …)“* tragen keinen Ablehnungsstamm, kein `?` und keinen Stamm des Wartens und werden als Zustimmung gelesen — **die Direktive wird gelöscht.** Am Code gelesen, nicht gelaufen. Die Listen sind dort bewusst nicht erweitert: Die Kopie folgt dem Muster der beiden Dienste.
**Geschlossen, wenn** in ~~beiden Diensten~~ → den drei Diensten (seit dem 24.10.2026 auch `direktiven`) eine Ablehnung neben einem Zustimmungswort nicht als Zustimmung gelesen wird, auch ohne Stamm aus `REFUSAL_STEMS` — bezeugt mit den drei Sätzen. Mit `KLA-KLAERFALL-AM-OBJEKT` Schritt 5 und 6 löst ein geschlossener Leser im Code diese Deutung ab.
---
### `WURZELN-ABLEHNUNG-UNGELESEN` — am Tor der Dateien-Wurzeln lesen sich *nichts*, *keinesfalls* und *ablehnen* nicht als Ablehnung
**Kategorie:** CHA
**Rang:** **mittel** — still, an einem Tor, das Lesezugriff auf ein Verzeichnis des Menschen freigibt; die Sätze sind selten. Vergeben am 20.10.2026 gegen HEAD `b52e919`; die Datei ist seit `04491c6` unverändert.
**Zustand:** **geschlossen am 25.10.2026 — behoben mit `e1e0724`** (Code-Tree `f901e08`, die Doku dazu `d2d6ec8`): *„ja, bitte nichts“*, *„ok, keinesfalls“* und *„ja, ablehnen“* bestehen nicht aus Zustimmungs- und Füllwörtern und sind unklar; der Docstring von `_traegt` sagt den heutigen Stand. **Belege:** Zeugen je Dienst — `ClosedConsentTest`, `ClosedSignsTest`, `RefusalFirstTest`, `ExcludedWordsTest`, `WordOrderTest` und `ClauseSeparatorsTest` in `server/tests/agents/{direktiven,notizen,charakter_identitaet}/test_resume.py`, in `server/tests/test_dateien_wurzeln.py` als `GeschlosseneZustimmungTest`, `GeschlosseneZeichenTest`, `AblehnungZuerstTest`, `AusgeschlosseneWoerterTest`, `WortstellungTest` und `TrennzeichenTest`; Server-Suite am Code-Tree `Ran 5394 tests` · `OK (expected failures=2)` (vorher 5276); MESSUNG vor dem Commit `[gemessen 24.10.2026]` an 305 ungezeigten Antworten durch die vier Deutungen, ohne GPU und Datenbank: 0 Fehlausführungen in allen vier Diensten (am Stand davor 33 bis 50 je Dienst), Nachprobe der Wortstellung 14 von 14 unklar. **Warum geschlossen:** Die Schließbedingung verlangt Zeugen, keine Messung im Betrieb; sie ist erfüllt. Die drei Sätze (*„ja, bitte nichts“*, *„ok, keinesfalls“*, *„ja, ablehnen“*) sind unklar bezeugt (`GeschlosseneZustimmungTest` in `server/tests/test_dateien_wurzeln.py`), Suite `Ran 5394 tests` · `OK (expected failures=2)`, und der Docstring von `_traegt` sagt den heutigen Stand. Im Betrieb ist dieses Tor nicht gemessen. **Davor:** offen — gemessen am 18.10.2026 an `_antwort_deuten`.
**Befund** `[gemessen 18.10.2026]`: `server/agents/dateien_wurzeln/resume.py::_antwort_deuten` sucht `ABLEHNUNGS_WOERTER` als ganze Wörter (`_traegt`): *nichts* ist nicht *nicht*, *keinesfalls* nicht *kein* oder *keine*, und *ablehnen* steht nicht in der Liste. Allein bleibt die Antwort unklar; neben einem Zustimmungswort wird sie Zustimmung — *„ja, bitte nichts“*, *„ok, keinesfalls“*, *„ja, ablehnen“*. **In derselben Datei:** Der Docstring von `_traegt` nennt die Teilzeichenketten-Deutung in `charakter_identitaet/resume.py` als offenen Fund; sie ist seit dem 18.10.2026 behoben (`novaberg-bugs-archiv-charakter.md`).
**Geschlossen, wenn** neben einem Zustimmungswort keine Ablehnung als Zustimmung gelesen wird, auch *nichts*, *keinesfalls* und *ablehnen*, und der Docstring von `_traegt` den heutigen Stand sagt.
---
## 18.10.2026 — behoben und an den Funktionen der Deutung gemessen
**Dieser Eintrag ist mit einem Bau geschlossen und gemessen** — an den Deutungsfunktionen beider Dienste, am Code vor und nach dem Bau, in einem Wegwerf-Behälter ohne Netz; nicht in einem Turn des Betriebs. Die Zustandszeile nennt Ort, Zeugen und Messung.
---
### `ZUSTIMMUNG-GILT-ALS-ABLEHNUNG` — die Ja/Nein-Deutung am Tor las Teilzeichenketten
**Kategorie:** CHA
**Rang:** **mittel** — still: *„ja, gerne“* ergibt `ABLEHNUNG`, weil `"ne"` als Teilzeichenkette in *gerne* steht und die Ablehnung zuerst geprüft wird (`server/agents/charakter_identitaet/resume.py:88-98`, am 05.10.2026 nachgerechnet). Durchsicht 05.10.2026, gegen HEAD `17bf86e`: gilt; dieselbe Deutung steht in `server/agents/notizen/resume.py:135-154`, behoben ist nur `dateien_wurzeln`.
**Zustand:** ✅ **behoben am 18.10.2026** im Tree `9153022` (der geprüfte Diff `ae05667..c990549`, fünf Dateien) — In `charakter_identitaet` (`_standard_interpretieren`) und `notizen` (`_resume_nicht_gefunden`) wird die Ablehnung zuerst geprüft und gewinnt; sie sucht ihre Wortstämme (`REFUSAL_STEMS`, auch `ne`) weiter als Teilzeichenkette, aber im Text ohne die Zustimmungswörter des Moduls (`CONSENT_WORDS`, herausgenommen über `_without_words`). Die Zustimmung zählt nur ganze Wörter, und in `notizen` wählt eine Ziffer, eine ID oder ein Name einen Kandidaten nur als ganzes Wort (`_candidate_keys`; *„11 Uhr“* wählt nicht mehr den ersten). **Zeugen:** `server/tests/agents/charakter_identitaet/test_resume.py` und neu `server/tests/agents/notizen/test_resume.py`, 7 → 58 Testmethoden, darunter je ein Klassen-Zeuge, der die alte Teilzeichenketten-Deutung aus den Stämmen des Moduls nachrechnet; die Gegenprobe ist vorhergesagt, nicht gelaufen. Server-Suite am geprüften Tree `c990549` (der Bau allein auf `ae05667`) `Ran 4635 tests` / `OK (expected failures=2)`, am `HEAD` `ae05667` `Ran 4584` / `OK (expected failures=2)`; Client-Suite `Ran 561` / `OK`. **Gemessen** mit `labor/2026-10-18_zustimmung/deutung.py` — 41 Antwortformen (synthetisch), beide Deutungen, am Code von `ae05667` gegen den geprüften Tree, in einem Wegwerf-Behälter ohne Netz: 23 Zeilen ändern sich. Von Ablehnung zu Zustimmung gehen genau vier (`charakter_identitaet` *„ja, gerne“*, *gerne*, *meinetwegen*; `notizen` *meinetwegen*), von Zustimmung zu Ablehnung 20, alle in `notizen`, darunter *„nein, bitte nicht“*, *„bitte nichts anlegen“*, *„mach das nicht“*. *„ja, leg ne neue an“* lehnt ab — die sichere Richtung, bewusst so.
*Zustand bis 18.10.2026:* offen — gegen HEAD `9bcd214` gemessen am 24.08.2026. Unveraendert: `server/agents/charakter_identitaet/resume.py:92` prueft weiter `any(kw in text for kw in ablehnungs_keywords)` mit `"ne"` in der Liste — und da Zeile 92 vor Zeile 99 steht, faellt `gerne` in die Ablehnung. **Ueber alle vier `resume.py` gegengeprueft:** Wortgrenzen kennt genau eine Stelle, `dateien_wurzeln/resume.py:114` (`re.search(rf"\b{re.escape(wort)}\b", text)`); ~~`notizen` und `timeline` tragen gar keine eigene Ja/Nein-Deutung mehr, der Satz zur uebernommenen Bauart im Befund ist damit ueberholt. Es bleibt **eine** defekte Deutung, nicht vier.~~ → **widerlegt am 18.10.2026, am Code von `9bcd214` und von `ae05667`:** `notizen/resume.py::_resume_nicht_gefunden` deutete selbst, mit Teilzeichenketten und **die Zustimmung zuerst** (Z. 131 vor Z. 148 bzw. Z. 135 vor Z. 154) — *„nein, bitte nicht“* trägt `bitte` und legte die Notiz an. Nur `timeline` deutet kein Ja oder Nein; seine Antworten schreiben nie. Es waren **zwei** defekte Deutungen, und die zweite fiel in die unsichere Richtung.
**Befund.** Die Ja/Nein-Deutung der Torwächter vergleicht **Teilzeichenketten**. `_standard_interpretieren` in `agents/charakter_identitaet/resume.py` prüft `any(kw in text for kw in ...)` gegen eine Liste, die `ne` enthält — und `ne` steckt in `gerne`. Am laufenden Bestand gemessen:
| Antwort | gedeutet als |
|---|---|
| `gerne` | **abgelehnt** |
| `meinetwegen` | **abgelehnt** |
| `ja, gerne` | **abgelehnt** |
| `ja bitte` · `na klar` · `ok` | bestätigt |
**Warum es ein Defekt ist.** *„Ja, gerne"* ist keine Randformulierung, sondern eine der häufigsten Zustimmungen im Deutschen. Der Mensch bestätigt am Tor, die Änderung unterbleibt, und die Meldung sagt ihm, **er habe abgelehnt**. Der Ausfall ist stumm: Es gibt keinen Fehler, keinen Log-Eintrag auf Fehlerniveau und kein Symptom außer der ausgebliebenen Wirkung.
**Die Richtung ist die sichere, und das ist der Grund, warum es niemand gemerkt hat.** Eine fälschlich unterbliebene Änderung kostet eine Nachfrage; sie richtet keinen Schaden an und fällt deshalb nicht auf. Der Preis ist ein Tor, das der Mensch nicht bedienen kann, ohne die zulässigen Wörter zu kennen.
**Reproduktion.** Drei Zeilen:
```python
from agents.charakter_identitaet.resume import _standard_interpretieren
_standard_interpretieren("ja, gerne") # -> 'abgelehnt'
```
**Herkunft des Fundes.** Nicht am Bestandscode gefunden, sondern an einem **Neubau derselben Bauart**: Der Wurzeln-Dienst hatte die Wortliste übernommen, und ein echter Turn mit `Ja, gerne.` endete ohne Schreibung. Dort ist es am 18.08.2026 auf Wortgrenzen (`\b…\b`) umgestellt und mit zwei Zeugen abgesichert; die Bestandsstelle blieb unberührt — **keine Reparatur im Vorbeigehen**.
**Betroffen.** `charakter_identitaet` sicher. `notizen/resume.py` trägt laut Kommentar dieselbe Bauart und ist ~~**nicht nachgemessen** — das gehört zur Behebung, nicht zum Befund.~~ → **mit der Behebung gemessen** (18.10.2026): dieselbe Teilzeichenkette, und dort wurde die Zustimmung zuerst geprüft (oben).
**Warum geschlossen:** Die Schließbedingung ist für die Dienste erfüllt, die ein Ja oder Nein deuten. Ein Zeuge je Dienst hält *„ja, gerne“* gegen Zustimmung und *ne* allein gegen Ablehnung (`test_consent_with_ne_inside_a_word_confirms` bzw. `test_consent_creates`, `test_every_ne_refuses_also_as_article`); `dateien_wurzeln` deutet seit dem 18.08.2026 an Wortgrenzen, `timeline` schreibt auf keine Antwort. **An Wortgrenzen gelesen wird nur die Zustimmung:** Die Ablehnung bleibt ein Stamm als Teilzeichenkette, bewusst weiter als die Bedingung, in der sicheren Richtung. Gemessen ist ein Lauf an den Deutungsfunktionen, am Tree, nicht am Commit und nicht in einem Turn des Betriebs. **Benannte Grenzen:** Der Direktiven-Dienst deutet seine Antwort gar nicht und führt auch ein Nein aus (`DIREKTIVEN-FUEHRT-JEDE-ANTWORT-AUS`, ~~[`novaberg-bugs-charakter.md`](novaberg-bugs-charakter.md)~~ → behoben mit `6846120`, geschlossen am 26.10.2026, in dieser Datei). Ablehnungswörter ohne Stamm in der Liste (*„vergiss es“*, *nö*, *niemals*) bestätigen neben einem Zustimmungswort, und die Verneinung bei *neu*, *aktualisieren* und bei der Wahl wird nicht gelesen (Fundliste, 18.10.2026).
**Geschlossen, wenn.** Alle Torwächter deuten an Wortgrenzen, und ein Zeuge je Dienst hält `ja, gerne` gegen `bestaetigt` sowie `ne` allein gegen `abgelehnt`.
---
## 06.10.2026 — geschlossen durch Entscheidung
**Diese Einträge waren offen, weil eine Absicht fehlte, und die Entscheidung vom 06.10.2026 verlangt keinen Bau.** Der Befund ist damit hingenommen, nicht behoben; die Zustandszeile je Eintrag sagt, was gilt.
---
### `RAD-WERT-AUF-SPALTEN-DEFAULT`
**Kategorie:** CHA
**Zustand:** geschlossen am 06.10.2026 durch Entscheidung, nicht behoben — das Herkunftsfeld unterscheidet einen gerechneten Wert vom Spalten-Default; der Default bleibt.
**Rang:** **niedrig** — entschärft durch das Herkunftsfeld (`server/agents/charakter/agent.py:1224-1226`, `server/memory/charakter.py:98`); ~~wartet auf eine Absicht: Genügt das Herkunftsfeld (dann schließen), oder wird der Spalten-Default `0.9` (`db/init.sql:1022`, gleich `RAD_NABE`) zu NULL?~~ → **entschieden am 06.10.2026** (unten). Letzteres wäre DDL. Durchsicht 05.10.2026, gegen HEAD `17bf86e`.
**Entschieden am 06.10.2026** vom Eigentümer — *„Alle wie empfohlen“*, über 23 offene Absichtsfragen des Registers zugleich. Für diesen Eintrag: **Das Herkunftsfeld genügt**; der Spalten-Default bleibt, und der Eintrag ist geschlossen.
**Befund (2026-07-30).** Ein gerechneter Rad-Wert kann **exakt auf dem Spalten-Default landen**, und dann ist er von „nie erhoben" nur noch am Herkunftsfeld zu unterscheiden. Gemessen am 30.07.2026, 20:07 UTC: Novas `nutzer_gewichtung` stand auf **0.90** — dem Wert der Nabe und zugleich dem Default der Spalte —, entstanden aus `+0.12` Zuwendung gegen `−0.12` Abwendung, die sich exakt aufhoben. Fünf von zwölf Speichen waren belegt, die Fläche im Diagramm deutlich schief. Ohne `nutzer_gewichtung_quelle` wäre das ein Ausfall gewesen, der wie ein Messergebnis aussieht; mit ihm und der Speichen-Anzeige ist es auf einen Blick als Messung lesbar. Der Fund ist nicht der Wert — bei der nächsten Destillation um 22:00 UTC stand er auf 1.06 —, sondern der Beleg, dass der vorhergesagte Kollisionsfall im Bestand tatsächlich eintritt (`novaberg-lesson_l_default-wie-fehlschlag.md`, `novaberg-gv-initiative_k.md` §6.4).
**Was fertig waere.** Ein gerechneter Wert ist ohne Blick aufs Herkunftsfeld von einem nie erhobenen unterscheidbar.
**Prioritaet:** mittel.
---
## 05.10.2026 — geschlossen bei der Durchsicht der offenen Eintraege
**Diese Eintraege standen als offen im Register und waren es nicht mehr.** Am 05.10.2026 ist jeder offene Eintrag gegen den Code am HEAD `17bf86e` gehalten worden; die Zustandszeile je Eintrag nennt den Beleg. *Behoben* heisst: Die Abhilfe steht im Code. *Gegenstandslos* heisst: Die Stelle, an der der Befund galt, gibt es nicht mehr.
---
### `UEBERSTEUERUNG-GREIFT-NICHT` — 0 von 14 Landschaften
**Kategorie:** CHA
**Zustand:** behoben — gegen HEAD `17bf86e` nachgesehen am 05.10.2026. **Behoben schon am 12.08.2026** (`5484ef6`, *„the override never reached a landscape, and now it pulls“*): Die Übersteuerung ist nicht mehr auf Grenzzellen beschränkt, `_uebersteuerer` zieht an jeder Größe, auch an `naehe` (`server/ei/haltung.py:810-852`). Der Zustand vom 20.08.2026 hielt den Eintrag gegen `CLUSTER_GRENZE` statt gegen die Verrechnung; `CLUSTER_GRENZE` ist unverändert und hier nicht mehr die Ursache. Dass sie greift, zeigt `ZUG-ZWISCHEN-090-097-ABGESCHALTET` (Nähe 0,82 gegen 0,00).
**Zustand bis 05.10.2026:** offen — gegen HEAD `00c16b6` gehalten am 20.08.2026. `CLUSTER_GRENZE` (`ei/haltung.py:113`) fuehrt weiter ausschliesslich `draengen` und `fragen`.
**Befund (11.08.2026), aus der Fundliste uebernommen.** Die Übersteuerung `distanz → naehe` greift in **0 von 14** Landschaften, auch bei voller Ausprägung 1.0 und unabhängig von der Schwelle. Eine Übersteuerung wirkt nur, wo die Größe eine **Grenze** ist; `CLUSTER_GRENZE` führt über alle Landschaften ausschließlich `draengen` und `fragen`, `naehe` in keiner. Sie war damit seit dem Bau am 31.07.2026 wirkungslos. `wissbegier → fragen` greift dagegen in 3 von 14 (`nebel`, `gewitter`, `paradox`). `novaberg-haltungsraum_k.md` §2 sagt das Gegenteil — *„`distanz` bei 1.0 übersteuert die Nähe, gleich wie warm die Landschaft ist"* —, das Konzept ist also die Absicht und der Code bleibt dahinter zurück.
**Geschlossen, wenn** Die Uebersteuerung greift dort, wo die Groesse eine Grenze ist — oder sie entfaellt.
---
### `RAD-MEDIAN-SCHUETZT-FALSCHE-QUELLE`
**Kategorie:** CHA
**Zustand:** behoben — gegen HEAD `17bf86e` nachgesehen am 05.10.2026. **Der zweite Zweig der Schließbedingung ist erfüllt, der Kern ist stabilisiert:** Seit `3ef6e1b` (27.08.2026) destilliert der Knoten `charakter_hash` mit Temperatur 0,0, und die Kerne aus identischem Material sind zeichengleich (`server/config.py:3118-3140`, gemessen gegen `OllamaProvider/qwen36-cpu`, benannt in `9eb3ecc`). Der Hintergrund läuft weiter auf `qwen36-cpu` (`server/config.py:323`). **Die Bedingung hängt am Aufbau:** Wechselt der Knoten Modell oder Backend, ist die Zeichengleichheit neu zu messen, und der Eintrag lebt wieder auf. Dass die drei Rad-Läufe nach `F-RAD-2` bei 0,0 zeichengleich und damit ein Leerlauf zu dreifachen Kosten sind, ist bekannt und eigens zu behandeln.
**Zustand bis 05.10.2026:** offen — gemessen am 26.08.2026 gegen den Produktivbestand. → **Der naheliegende Griff ist am selben Tag gebaut, gemessen und verworfen** (Konzept §3.1e): Der **Kern-Medoid** aus drei Laeufen senkt die Spanne des Zuwendungsfaktors von **0,2908 auf 0,2615** bei **dreifacher** Rechenzeit — bei vier Punkten je Reihe nicht von Rauschen zu unterscheiden. `PIXIE_CHARAKTER_KERN_LAEUFE` steht deshalb auf **1**; der Mechanismus und die Senke (`kern_erhebung` im `pipeline_log`) bleiben gebaut. **Was das ausschliesst, ist mehr wert als das, was es liefert:** Die Mehrfacherhebung des Kerns ist als Weg geprueft und zu teuer fuer ihre Wirkung — der Medoid waehlt den zentralsten aus **drei** Ziehungen einer sehr breiten Verteilung, und der ist immer noch fast eine Ziehung. **Die Streuung muss dort kleiner werden, wo sie entsteht: bei der Ableitung selbst.** → **Und dort ist sie am 26.08.2026 gefunden.** Der Knoten `charakter_hash` lief mit `temperature = 0.2`, ohne belegte Herleitung. Vier Laeufe auf demselben Material: bei **0.2** eine Ueberdeckung von **32,9 %**, bei **0.0** **zeichengleiche** Fassungen (viermal 4798 Zeichen). **Die Temperatur erklaert die Breite vollstaendig**, und sie steht seither auf 0.0. **Damit faellt die Ursache dieses Eintrags weg** — ob der Faktor jetzt stabil ist, ist die naechste Messung; ob ein Kern bei 0.0 auch *besser* ist, ist eine andere Frage und ungemessen. **Nebenwirkung, gemessen statt vermutet:** Drei Rad-Laeufe auf demselben Eingang liefern bei 0.0 **1,2977 · 1,2977 · 1,2977** — Spanne 0,0000. Die Mehrfacherhebung aus `F-RAD-2` ist damit ein Leerlauf mit dreifachen Kosten.
**Befund.** **`F-RAD-2` verlangt drei Rad-Laeufe und den Median, aber alle drei lesen denselben Kern-Hash — und dessen eigene Ziehung bewegt den Faktor fuenfmal staerker.** Gemessen mit **festgehaltenem** Turn-Material und **festgehaltenem** Beziehungsprofil; variiert wurde allein der Kern, viermal frisch destilliert, auf jedem ein Zuwendungs-Rad mit den vorgeschriebenen drei Laeufen und Median:
| | Spanne des Faktors |
|---|---|
| Innerhalb eines Kerns, drei Laeufe | **0,0550** im Mittel (groesste 0,1041) |
| Ueber vier Kerne, je Median aus drei | **0,2908** |
Die vier Mediane: 1,2088 · 1,1426 · 1,0695 · 0,9180. **Bei einer Faktorspanne von 0,5 bis 1,5 sind das 29 % des gesamten Bereichs** — allein daraus, welche Ziehung des Kerns das Rad gerade gelesen hat. Die Streuung ueber Kerne ist das **5,3-fache** der Streuung innerhalb eines Kerns.
**Die Begruendung von `F-RAD-2` bleibt richtig und trifft die kleinere Quelle.** Sie lautet: Ein Wert, der bei der Destillation einmal geschrieben wird und bis zur naechsten stehenbleibt, darf nicht von einem unglueklichen Lauf fuer Tage festgelegt werden. Genau das gilt eine Stufe frueher auch — und dort ist es fuenfmal so gross.
> **Es trifft ausgerechnet den Faktor, mit dem die Festlegung sich selbst begruendet:** Er geht in die Salienz **jedes** Nutzerbeitrags ein.
**Die Ursache ist bekannt und heute gemessen:** Zwei Destillationen des Kerns aus **identischem** Material teilen nur **27–32 %** ihres Inhaltswortschatzes (`novaberg-pixie-character-hash.md` §3.1c). Das Rad liest also eine Quelle, die selbst nur zu rund einem Drittel wiederholbar ist. **Ein Zusammenhang mit der Kernlaenge besteht nicht** — der laengste Kern (4850 Zeichen) liefert 1,0695, der kuerzeste (3987) 0,9180.
**Und der Befund beantwortet eine seit dem 30.07.2026 offene Frage.** `novaberg-charakter-rad-messreihe_k.md` hielt fest, die Drift zwischen zwei Erhebungen erreiche das Dreissigfache der Streuung innerhalb einer, und liess offen, *„ob sich der zugrundeliegende Profiltext zwischen den beiden Laeufen geaendert hat"*. **Er muss sich nicht aendern.**
**Geschlossen, wenn** die gespeicherte Unsicherheitsangabe die Bewegung erfasst, die den Faktor tatsaechlich bestimmt — oder der Kern so weit stabilisiert ist, dass sie es nicht mehr muss.
**Prioritaet:** hoch. Der Faktor ist eine kalibrierte Eingangsgroesse der Salienz, und seine einzige Verlaesslichkeitsangabe ist um den Faktor fuenf zu klein.
---
### `RAD-GESPEICHERT-NICHT-REPRODUZIERBAR`
**Kategorie:** CHA
**Zustand:** gegenstandslos — gegen HEAD `17bf86e` nachgesehen am 05.10.2026. Die verglichene Größe gibt es nicht mehr: Der gespeicherte Wert ist das Mittel der Reihe (`server/agents/charakter/agent.py:994`, `server/agents/charakter/rad_messreihe.py:89`), und der Knoten läuft auf Temperatur 0,0 (`server/config.py:3137`). Die neu gefasste Bedingung ist für `nova → meister` am 12.08.2026 erfüllt; was den Wert vor dem 01.08. schrieb, ist nicht mehr feststellbar.
**Zustand bis 05.10.2026:** offen, **ueberholt** — nachgesehen am 25.08.2026, und am 27.08.2026 ein zweites Mal ueberholt: Der Eintrag laesst offen, *„ob die gespeicherte Null aus einer anderen Temperatur stammt"* — **der Knoten steht seit dem 26.08.2026 auf `temperature = 0.0`**, und drei Rad-Laeufe auf demselben Eingang sind zeichengleich (Spanne 0,0000). Eine Nichtreproduzierbarkeit **derselben** Eingabe kann es damit nicht mehr geben; bleibt allein die Frage, ob die gespeicherte Eingabe die war, die man glaubt. Der Befund misst eine **einzelne** Destillation gegen einen **einzelnen** gespeicherten Wert. Seither ist der Median aus drei Laeufen gebaut (`speichenweise_mediane`, `speichen_median` in `agents/charakter/`), und damit misst die alte Anordnung nicht mehr dasselbe. **Die Frage bleibt und die Zahl nicht:** Ob ein gespeichertes Rad reproduzierbar ist, ist gegen das heutige Verfahren neu zu messen.
**Befund (2026-08-01).** **Das gespeicherte Zuwendungs-Rad ist nicht reproduzierbar.** Die Destillation mit exakt der Produktions-Eingabe (`kern` + `beziehungsprofil`, 1371 Zeichen, unverändert seit 20:18 UTC) liefert zweimal deterministisch `distanz 0.5`; gespeichert steht `distanz 0.0`. Mit `kern` + `adaptive_hash` statt des Beziehungsprofils antwortet dasselbe Modell `distanz 1.0`. **Genau diese Speiche trägt die größten negativen Beiträge des Haltungsraums** (Umfang −0.3, Nähe −0.5, Wärme −0.2) — sie entscheidet, ob die Modifikation überhaupt subtrahieren kann. Ob die gespeicherte Null aus einer anderen Temperatur, einem anderen Aufrufweg oder einem dritten Eingabetext stammt, ist offen.
**Nachtrag desselben Tages, ein geprueftes Nein.** Die gesamte **Abwendungsseite** des gespeicherten Rades steht auf 0.0, die Zuwendungsseite trägt 5 von 6 Speichen (zwei davon auf 1.0). Der Verdacht, das Ausgabeschema im Prompt zeige alle zwölf Werte als `0.0` und verankere damit die Null, ist **geprüft und widerlegt**: Mit einem Platzhalter statt der Nullen ändert sich die Abwendungssumme nur von 1.5 auf 2.0.
**Nachtrag 12.08.2026 — die Abnahmebedingung ist heute unerreichbar, und das ist kein Defekt.** Der gespeicherte Wert ist seit dem 01.08. **kein Einzelmessergebnis mehr**, sondern das gewichtete Mittel der Reihe über die letzten fünf Erhebungen (`novaberg-charakter-rad-messreihe_k.md` §4). Eine einzelne Destillation kann ihn deshalb **konstruktionsbedingt** nicht reproduzieren — gemessen an `nova → meister` am 12.08.: frische Erhebung 1,3582, gespeichert 1,2099, weil 58,7 % des Wertes aus vier älteren Erhebungen kamen.
Zum Befund selbst: Das Archiv (`charakter_rad_messung_archiv_20260812`) trägt für den 01.08. genau **eine** Reihenzeile je Richtung — `meister → nova` mit `distanz 0.5` um 13:20. Der damals gespeicherte Wert 0,0 war damit **älter als die erste Reihenzeile**; verglichen wurde eine frische Destillation gegen einen Wert aus dem vorigen Stand, nicht gegen dieselbe Rechnung.
**Was fertig waere — neu gefasst.** ~~Die Eingabe, aus der das gespeicherte Rad entstand, ist benannt und reproduziert es~~ → Die **Reihenrechnung** ist aus ihren Zeilen nachgerechnet und trifft den gespeicherten Wert; ein Einzellauf wird dabei ausdrücklich **nicht** erwartet. Für `nova → meister` ist das am 12.08. geschehen: `reihe_laden` + `rad_zusammenfassen` reproduzieren die 1,2099 auf vier Stellen.
**Prioritaet:** ~~hoch~~ → **niedrig.** Die ursprüngliche Sorge — ein Wert, der jede abgeleitete Zahl mitträgt — bleibt richtig; sie richtet sich aber gegen die **Reihe**, und die ist nachrechenbar. Offen bleibt allein, was den Wert vor dem 01.08. geschrieben hat, und das ist nicht mehr feststellbar.
---
### `KERN-HASH-USER-STATT-NOVA` — kern_hash beschreibt User statt Nova
**Kategorie:** CHA
**Zustand:** behoben an der Wurzel — gegen HEAD `17bf86e` nachgesehen am 05.10.2026. Die Wurzel war die Datenquelle (Novas Stimme nirgends dauerhaft); seit `c36fc74` (10.08.2026) liest der Kern den Wortlaut aus `pipeline_log` (`turn_roh`, `server/agents/charakter/agent.py:594` `_turns_laden`), seit `37f9e47` (17.08.2026) je Perspektive die eigene Seite. Was der Kern heute falsch beschreibt, führen `KERNHASH-OHNE-PERSPEKTIVTRENNUNG` und `KERNHASH-TRAEGT-KEINE-PERSON`.
**Entdeckt:** Chat 27
**Prio:** Niedrig — Destillations-Thema.
→ Chat 103: Wurzel ist nicht die Destillation, sondern die Datenquelle — Novas Stimme wird nirgends persistent gespeichert (Redis-Turns 2h TTL, gespraech_archiv verwaist). Siehe Backlog NOVA-STIMME-NICHT-PERSISTENT.
---
### `HASH1` — Character Hash Recency-Bias
**Kategorie:** CHA
**Zustand:** gegenstandslos — gegen HEAD `17bf86e` nachgesehen am 05.10.2026. Der Eintrag nennt keine Ursache; ein Recency-Bias der Auswahl ist heute nicht mehr gebaut: Die Destillation wählt die LZG-Knoten nach `gewicht_absolut` und `haeufigkeit`, ohne Zeitanteil (`server/agents/charakter/agent.py:728-735`, seit `1ed498f`, 08.07.2026), und der Kern liest zusätzlich den Wortlaut der Turns. Der Bestand, an dem *„alle Top-20 negativ“* galt, ist am 12.07.2026 zurückgesetzt. Eine Schlagseite der Valenz nach Gewicht wäre ein neuer Befund.
**Symptom:** Alle Top-20 LZG-Einträge negativ, positive Wendung fehlt.
---
### `MODUS-KALIBRIERUNG` — Perzeption klassifiziert spielerische Inhalte als "emotional"
**Kategorie:** CHA
**Zustand:** behoben — gegen HEAD `17bf86e` nachgesehen am 05.10.2026. Der Lösungsansatz steht: Beide Perzeptions-Prompts erklären seit `0b1b9bc` (12.09.2026) jeden Modus mit seinem Kriterium, `spielerisch` = *„Unernst, Neckerei, Wortspiel“*, `emotional` = *„Gefühle sind der Gegenstand, nicht nur der Rahmen“* (`server/prompts/default/perzeption.task.txt:48-62`). Der Fall des Eintrags ist nicht nachgemessen.
**Entdeckt:** Chat 72, 01. Mai 2026
**Symptom:** Perzeption stuft 😍-Katzen-Chat als `gespraechs_modus="emotional"` statt `"spielerisch"` ein. Beeinflusst die Tiefe-Achse der Dreischicht-Architektur und damit die Sektor-Berechnung im GV.
**Status:** Kein Bug, sondern Kalibrierungsfrage. Der Perzeption-Prompt unterscheidet die Modi nicht trennscharf genug.
**Lösungsansatz:** Modus-Beispiele im Perzeption-Prompt schärfen. Spielerisch (Tier-Niedlichkeit, Quatschen, leichte Themen) klar von emotional (Beziehungsthemen, Sorgen, Tiefe) abgrenzen.
**Prio:** Niedrig — kosmetisch, beeinflusst die Sektor-Verteilung leicht, aber bricht keine Funktion.
---
## 30.08.2026 — eine Schwelle, die nicht mehr ablehnt
> **Geteilter Abschnitt.** Seine Eintraege liegen in mehreren Gegenstaenden; hier stehen die von **Charakter**, die uebrigen in [Gedächtnis](novaberg-bugs-archiv-gedaechtnis.md). Ueberschrift und Text stehen in jedem empfangenden Teil.
Zwei Eintraege aus derselben Messung, **beide am 30.08.2026 behoben**. Der erste ist ein
**Schwellwert auf einer Groesse, die ihren dokumentierten Wertebereich verlassen hat**; der zweite
ist der Grund, warum der erste so lange unbemerkt blieb — **es gab nichts zu zaehlen**.
### `PROFIL-SCHLUESSEL-MIT-LEERRAUM` — ein Leerzeichen kostet den Traeger dauerhaft
**Kategorie:** CHA
**Zustand:** behoben am 03.09.2026 ✅
**Symptom.** `[gemessen]` 03.09.2026, 21:21 UTC: Der Erstlauf der Qualitaetsprofile ueber 20
Traeger verlor **4**, und alle vier mit derselben Meldung — *„Schluesselsatz weicht vom Kanon
ab — fehlend ['ungewissheit'], unerwartet ['un gewissheit']"*. Das Modell setzt ein Leerzeichen
in einen Bezeichner, den es im Prompt woertlich vorgegeben bekommt, und zwar reproduzierbar an
derselben Stelle: viermal `ungewissheit`, nie eine andere Dimension.
**Wirkung.** Nicht ein verlorener Lauf, sondern ein **dauerhaft verlorener Traeger.** Die
Kandidatensuche nimmt, wer noch keine Kante traegt; ein an dieser Stelle gescheiterter Traeger
traegt keine und wird deshalb wieder gezogen — gegen dasselbe Modell, mit demselben Prompt,
bei Temperatur 0,0. Er faellt bei jedem Lauf erneut aus, und der Deckel von 20 Traegern je Lauf
fuellt sich mit Wiederholungen.
**Was ihn sichtbar machte.** Die Pruefung gegen den **Kanon** statt gegen eine Teilmenge: Sie
nennt beide Seiten, fehlend und unerwartet, und damit stand der Grund in der ersten Zeile. Eine
Teilmengen-Pruefung haette *„ungewissheit fehlt"* gemeldet und den Rest verschwiegen.
**Die Abhilfe raeumt nur Leerraum ab.** `_schluessel_entraeumen` zieht Leerraum in Schluesseln
zusammen, schreibt jede Berichtigung ins Log und verwirft, wenn dabei zwei Schluessel
kollidieren. Die Kanon-Pruefung darunter bleibt scharf — ein erfundener Name faellt weiterhin
durch, und ein Zeuge haelt genau das fest (`neu heit` → verworfen).
**Im Bestand belegt.** Die drei erneut gezogenen Traeger (4692, 3944, 1533) sind profiliert:
6 von 6, 0 gescheitert.
**Prioritaet:** mittel — der Verlust war still im Sinne der Wirkung, nicht der Meldung.
---
### `FALTUNG-OHNE-AUFRUFER` — die Beruehrung wird geschrieben und nie gelesen
**Kategorie:** CHA
**Zustand:** behoben am 01.09.2026 ✅
**Symptom.** `[gemessen]` 01.09.2026, 14:00 UTC: Die vierte Messreihe hat **4 Beruehrungen** in
`praegung_beruehrung` erzeugt (Naehen 0,682 · 0,684 · 0,739 · 0,682). `ausschlag_aktuell` aller
vier Faeden steht danach unveraendert auf `ausschlag_absolut` — 0,794 · 0,854 · 0,991 · 1,000.
Der Grund: `memory/praegung.py` → `ausschlag_aktuell_falten` hat **keinen Aufrufer im
Produktivcode**. `grep -rn "ausschlag_aktuell_falten" server/ --include=*.py` liefert ausserhalb
der Zeugen nur die Definition. Geschrieben wird `ausschlag_aktuell` genau einmal, beim Anlegen
des Fadens (Zeile 174).
**Wirkung.** Die Kette der Praegungsschicht ist **nicht** geschlossen, obwohl alle vier
Bauteile stehen und bezeugt sind (7 Zeugen, 18 Stuetzstellen gegen die Konzepttabelle). Der
Verfall findet nicht statt, die Auffuellung findet nicht statt: Ein Faden behaelt seinen
Eingangswert fuer immer — genau der Zustand, den Scheibe 2 beheben sollte.
**Dieselbe Klasse wie in Scheibe 1.** Dort war `beruehrung_anlegen()` gebaut, getestet und ohne
Aufrufer; der Befund steht seit dem 31.08.2026 in der Featureliste. **Der Nachfolgebauteil hat
den Fehler geerbt** — die Zeugen pruefen die Funktion, nicht ihre Verwendung, und eine gruene
Suite sagt darueber nichts.
**Was fertig waere.** `ausschlag_aktuell` wird bei jedem Lesen eines Fadens — oder in einem
periodischen Lauf — aus `entstanden_am`, `ausschlag_absolut` und der Beruehrungsliste neu
gefaltet, und ein Betriebsbeleg zeigt einen Faden, dessen `ausschlag_aktuell` von
`ausschlag_absolut` abweicht.
**Prioritaet:** hoch.
---
**Behoben am 01.09.2026, 15:05 UTC.** `memory/praegung.py` → `ausschlag_aktuell_nachfuehren`
liest `ausschlag_absolut`, `entstanden_am` und die vollstaendige Beruehrungsliste, faltet und
schreibt; `beruehrung_aus_reaktivierung` ruft sie fuer jeden getroffenen Faden. **Ausserhalb der
Transaktion, die die Beruehrung schreibt** — die Rechnung ist jederzeit wiederholbar, und ein
Fehler in ihr darf kein Ereignis mitnehmen.
`[gemessen]` im Betrieb, fuenfte Reihe: Faden 327 **0,793893 → 0,792117**, Faden 354
**1,000000 → 0,998756**. Der Unterschied ist klein, weil beide Faeden Stunden alt sind — bei
`PRAEGUNG_HALBSTRECKE` 60 Tage ist das die richtige Groessenordnung, und die Zeugen decken den
Bereich ab, den der Betrieb heute nicht erreicht.
**Neun Zeugen** in `tests/test_praegung_nachfuehrung.py`, davon drei auf die **Verwendung**
statt auf die Rechnung; zwei Gegenproben mit entferntem Aufrufer, **2 vorhergesagt und 2
gezaehlt**, dann **1 und 1**. Suite 2772 → **2781 gruen, 0 uebersprungen**.
**Beide Schreibwege falten.** Die zweite Kontrolle fragte nicht die eigene Liste ab, sondern
den Baum: *wer schreibt sonst noch in `praegung_beruehrung`?* `beruehrung_anlegen` tat es —
ohne Aufrufer im Produktivcode und ohne Nachfuehrung. Haette nur der gebaute Weg sie bekommen,
stuende derselbe Defekt an der anderen Tuer, sobald ihn jemand benutzt.
**Der Rest war benannt und ist am selben Tag geschlossen:** Der Verfall *zwischen* zwei
Beruehrungen erreichte die Spalte nicht — `FALTUNG-OHNE-PERIODISCHEN-LAUF`, seit 15:20 UTC
erledigt durch `alle_faeden_nachfuehren` als vierten Schritt im Tageslauf.
### `FADEN-EMBEDDING-VERDUENNT` — der Faden trug den Turn, nicht sein Segment
**Kategorie:** CHA
**Zustand:** behoben am 01.09.2026, am selben Tag gefunden. Zeugen: `tests/test_praegung_faden_schema.py`.
**Symptom.** `praegung_faden.embedding` kam aus `state["prompt_embedding"]` — dem Vektor des **ganzen Turns**. Salienz und Emotion desselben Fadens kamen aus dem **staerksten Segment**, ausgewaehlt mit der ausdruecklichen Begruendung: *„Ein Turn mit einem einzigen einschneidenden Satz ist einschneidend, auch wenn drei belanglose daneben stehen — ein Mittel verduennte ihn."*
**Genau dieses Mittel stand im Embedding.** Der Faden trug die Wucht und den Sektor eines Segments und den Vektor des Durchschnitts.
**Warum das ein Defekt ist und nicht eine Einstellung.** Ein Faden wird ueber Embedding-Naehe wiedergefunden — das ist der einzige Weg, auf dem eine Reaktivierung ihn auffrischt (Konzept §7.12). `[gemessen]` 01.09.2026 ueber 19.900 Knotenpaare trennt diese Naehe ohnehin nur schwach: ohne geteiltes Thema Median **0,355**, mit geteiltem **0,504**, die Verteilungen ueberlappen breit. **Auf einem verduennten Vektor ist die Trennung noch schwaecher** — und ein Faden, der durch Zufallsaehnlichkeit aufgefrischt wird, wird unsterblich (§7.4). Dieselbe Ausfallklasse, wegen der `EMGRAV-SCHWELLE-TOT` ueberhaupt Vorbedingung dieser Schicht wurde.
**Behebung.** `_faden_embedding()` bettet den Segmenttext ein. Faellt der Embed-Dienst aus, wird auf den Turn-Vektor zurueckgefallen — **und die Torzeile vermerkt es**: `embedding_quelle` traegt `segment`, `prompt` oder `keins`. Ohne dieses Feld waere ein grober Faden von einem scharfen nicht zu unterscheiden, und die Naehe-Schwelle stuende auf gemischtem Material.
**Die Klasse ist allgemeiner als der Fall.** Wo eine Begruendung fuer **eine** von mehreren Eigenschaften desselben Objekts formuliert wird, gilt sie meist fuer alle — und die uebrigen werden nicht mitgezogen. Hier lag die Begruendung im Docstring der Funktion, die das Segment waehlt; das Embedding wurde vierzig Zeilen weiter unten aus einer anderen Quelle geholt.
**Verwandt:** `novaberg-lesson_l_groesse-am-falschen-ort.md` — dort dieselbe Familie mit vertauschten Groessen statt vertauschten Quellen.
> ### `[2×]` — dieselbe Klasse stand im selben Modul noch an einer zweiten Stelle
>
> **Behoben am 05.09.2026, vier Tage nach diesem Eintrag.** Der **Praegungszug** las weiterhin
> `state["prompt_embedding"]` — denselben gemittelten Turn, aus demselben Grund falsch. Ein Turn
> ueber zwei Themen bekommt einen Vektor zwischen beiden und liegt danach **keinem** der
> zugehoerigen Straenge nahe; die Naehe eines Mittelwerts ist keine Naehe.
>
> **Die Begruendung stand seit dem 01.09. woertlich im selben Modul** — in `_faden_embedding`,
> zwanzig Zeilen ueber der Stelle, die sie ignorierte. Die Behebung hatte den **gefundenen Fall**
> repariert und nicht nach dem naechsten gesucht.
>
> **Gefunden hat es eine Frage des Eigentuemers** (*„wenn mehrere Saetze mit verschiedenen Themen
> kommen, wie wollen wir dann die Naehe ausrechnen?"*), kein Zeuge und keine Pruefung.
>
> **Die Klasse ist damit hochgestuft und die Konsequenz benannt:** Wer einen Defekt behebt, sucht
> die **zweite Stelle derselben Klasse — im selben Modul zuerst.** Ein Grep auf die Quelle, aus der
> der falsche Wert kam (`prompt_embedding`), haette sie in Sekunden gezeigt.
## 25.08.2026, nachmittags — zwei Defekte, die ein Linter-Treffer sichtbar gemacht hat
> **Geteilter Abschnitt.** Seine Eintraege liegen in mehreren Gegenstaenden; hier stehen die von **Charakter**, die uebrigen in [Bauart](novaberg-bugs-archiv-bauart.md). Ueberschrift und Text stehen in jedem empfangenden Teil.
Beide standen jahrelang gruen und waren mit keinem Zeugen und keiner Messung zu finden:
Ihr Symptom ist die **Abwesenheit** einer Wirkung, und die sieht aus wie ein ruhiger Lauf.
Sichtbar wurden sie ueber `F841` — eine Variable, die zugewiesen und nie gelesen wird.
#### `VORHER-ZUSTAND-OHNE-SPUR` — sechsmal geladen, nie protokolliert ✅
**Kategorie:** CHA
**Zustand:** behoben am 25.08.2026, mit acht Zeugen.
**Symptom.** `agents/direktiven/crud.py` und `agents/charakter_identitaet/crud.py` lesen vor
jedem Schreibvorgang den bisherigen Datensatz — `vorher = _read_by_id(target_id)`, je
dreimal, unmittelbar vor `UPDATE ... SET aktiv = FALSE`. **Der Wert wurde in keiner der
sechs Stellen weiterverwendet.** Der `schritte`-Eintrag, in base.py ausdruecklich als
Audit-Trail deklariert, trug `id` und `verifiziert` und nicht den ersetzten Inhalt.
**Was das kostet.** Nach dem Soft-Delete ist die Zeile noch da, aber nicht mehr als *die
vorherige* erkennbar; bei `_update` liegt daneben die neue. Wer spaeter fragt, was ersetzt
wurde, hat keine Quelle. `18_NACHVOLLZIEHBARKEIT` verlangt die Eingangsgroessen einzeln —
hier war die Eingangsgroesse geladen und fallengelassen.
**Dass es sechsmal identisch in zwei Modulen steht, ist der eigentliche Befund:** keine
vergessene Zeile, sondern eine Absicht ohne Empfaenger.
**Abhilfe.** `_vorher_spur()` je Modul; der `schritte`-Eintrag traegt den ersetzten Inhalt.
Fehlt der Datensatz, steht dort `{"gelesen": False}` — ein leerer String saehe aus wie eine
leere Anweisung und waere ein Default, der wie ein Messwert aussieht.
`tests/test_vorher_spur.py`, **acht Zeugen**; Gegenprobe 4 vorhergesagt / 4 gezaehlt.
---
## 23.08.2026 — die Naht zwischen GV-Knoten und Haltungsstand
### `FUEHRUNGSMASS-AUF-FALSCHER-EBENE` — behoben am 23.08.2026
**Kategorie:** CHA
**Zustand:** behoben. `_initiative_aus_state` liest das Fuehrungsmass aus `state["gv_detail"]["initiative"]`, wo der Erzeuger es ablegt. Bis dahin las es `state["initiative"]` — einen Schluessel, den **niemand setzt**.
**Befund (23.08.2026).** **Der Defekt sass nicht in einem der beiden Bauteile, sondern zwischen ihnen.** Ueber den ganzen Baum gemessen: **ein** Schreiber (`_gv_detail_bauen`, `gespraechsvektor.py:1087`), **ein** Leser (`haltung.py:175`), zwei verschiedene Ebenen. Derselbe Knoten liest die Landschaft 130 Zeilen weiter richtig aus `gv_detail`.
**Die Folge ist der Stillstand des Impulswegs, und er ist auf den Tag datierbar.** Der Leser gab auf **jedem** Turn `(None, "gv_ohne_lauf")` zurueck; Riegel 2 der Zustellung behandelt ein fehlendes Fuehrungsmass als *unbekannt* und laesst dann keinen Einwurf durch. Riegel und Leser kamen im **selben Commit** (`5bd2ab4`, 15.08.2026) — und der letzte Impuls-Turn stammt vom **15.08.2026**. Der Riegel hat seit seinem Bau nie geoeffnet.
**Was er gekostet hat, ist eine Zahl.** Ueber 595 protokollierte Fuehrungsmasse lagen **217 (36,5 %)** bei oder unter `GV_INITIATIVE_SCHWELLE` = −0,05, also im Bereich *Nova fuehrt*. So oft haette der Riegel geoeffnet. Messwerkzeug: `labor/2026-08-23_fuehrungsmass_verteilung.sql`.
> **Warum acht Tage lang nichts anschlug, gehoert zum Befund.** Der Riegel schliesst bei Unbekanntem, und das ist richtig so (`novaberg-eigenzeit_k.md` §2.5: *„Der Ausfall oeffnete den Schalter, statt ihn zu schliessen"*). Ein dauerhaft geschlossener Riegel sieht deshalb aus wie eine Figur, die gerade nicht zugehen will — und `gv_ohne_lauf` ist ein vorgesehener Grund, keine Fehlermeldung. **Ein Ausfall, der sich als gueltige Entscheidung tarnt, hat keinen Melder.**
**Im Betrieb belegt am 23.08.2026:** Der Haltungsstand trug vor dem Eingriff `initiative` leer mit `initiative_grund=gv_ohne_lauf`, danach `initiative = 0.409` mit leerem Grund. Die Riegelzeile ging von `[wollen+0.55 frequenz- ruhe+]` auf `[wollen+0.49 frequenz-0.41 ruhe+]` — der Riegel entscheidet jetzt auf einer **Messung** statt auf Unbekanntem. Er sperrte dabei weiter, und zwar richtig: `initiative_bit` ist `0 if wert > schwelle else 1`, ein hoher Wert heisst *der Nutzer fuehrt*, und der Mensch hatte gerade geschrieben.
Zeugen: `tests/test_fuehrungsmass_naht.py` (8) — der Naht-Zeuge ruft den **echten** Erzeuger und schickt seine Ausgabe durch den **echten** Leser; ein Zeuge, der das Dict selbst zusammenstellt, prueft seine eigene Vorstellung von der Naht. Gegenprobe: 4 vorhergesagt, **5 gezaehlt**. Suite `Ran 2213 tests — OK`.
**Geschlossen, wenn** Der Haltungsstand traegt das Fuehrungsmass, das der GV-Knoten gerechnet hat.
---
### `GRUND-NENNT-FALSCHE-URSACHE` — behoben am 23.08.2026
**Kategorie:** CHA
**Zustand:** behoben. Drei Sachverhalte tragen drei Namen: `gv_ohne_lauf` (kein `gv_detail` — der Knoten lief wirklich nicht), `fuehrung_fehlt_im_detail` (er lief und liess das Mass aus), `masse_fehlen` / `ohne_wert` (er rechnete und kam nicht durch).
**Befund (23.08.2026).** **Der Grund behauptete, der GV-Knoten sei nicht gelaufen — und genau das hat die Untersuchung verzoegert.** Derselbe Haltungsstand trug `cluster=foyer`, und `cluster` kommt aus `gv_detail`: Der Knoten **war** gelaufen. Der Zweig griff aber, sobald `state["initiative"]` kein `dict` war, und das ist nicht dasselbe.
**Die Klasse ist allgemeiner als der Fall:** Ein Grundtext ist eine Aussage ueber die **Ursache**, nicht ueber die Stelle, an der der Code abbricht. Wer beides gleichsetzt, schickt jede spaetere Untersuchung an den falschen Ort — hier an den GV-Knoten, waehrend der Defekt im Leser sass.
Zeugen: `tests/test_fuehrungsmass_naht.py::DreiAusfaelleDreiNamenTest` (5), darunter der Fall, den `gv_ohne_lauf` bisher falsch benannte, und eine Zusicherung ueber alle vier Ausfaelle, dass keiner eine Zahl liefert.
**Geschlossen, wenn** Jeder Grund benennt die Lage, die ihn ausgeloest hat.
---
## 20.08.2026 — aus der Klassifikation der Fundliste
> **Geteilter Abschnitt.** Seine Eintraege liegen in mehreren Gegenstaenden; hier stehen die von **Charakter**, die uebrigen in [Gedächtnis](novaberg-bugs-archiv-gedaechtnis.md), [Hintergrund](novaberg-bugs-archiv-hintergrund.md), [Antwortpfad](novaberg-bugs-archiv-antwortpfad.md), [Wissen](novaberg-bugs-archiv-wissen.md), [Bauart](novaberg-bugs-archiv-bauart.md). Ueberschrift und Text stehen in jedem empfangenden Teil.
### `PROFILPROMPT-OHNE-GESCHLECHT` — das Modell raet, im selben Lauf verschieden
**Kategorie:** CHA
**Zustand:** behoben — gegen HEAD `12a7c6a` gebaut am 22.08.2026. Das Genus der Figur steht in `ASSISTANT_GENUS` (`config.py`, Vorgabe `w`), `_perspektive_aufloesen` liefert daraus `pronomen`, `pronomen_dat`, `pronomen_akk` und `possessiv`, und **jeder der fuenf Prompts gibt die Pronomen ausdruecklich vor**. Zeuge: `tests/test_traegerformen.py::test_jeder_prompt_gibt_das_genus_vor`.
**Die Formen allein genuegen nicht, und das ist die Lehre des Eintrags.** Ein gefuellter Platzhalter richtet den **Prompt**-Text; das Modell schreibt aber seinen **eigenen** und raet dort weiter. Deshalb steht die Vorgabe als Satz im Prompt und nicht nur als Formensatz in der Funktion.
**Der Ort ist eine Entscheidung, kein Zufall.** Der Backlog-Eintrag `ASSISTENT-GESCHLECHT-PRONOMEN` verlangte *„ein Geschlechts-Attribut am Charakter"* — also in der Datenbank. Gelegt ist es in die Konfiguration, **dorthin, wo heute der Name steht**: Solange `ASSISTANT_NAME` global per env kommt, waere ein paarbezogenes Genus daneben die Inkonsistenz. Wandert der Name mit `ASSISTENT-NAME-LAUFZEIT` in die DB, wandert das Genus mit; der Rest steht dort.
**Befund (19.08.2026), aus der Fundliste uebernommen.** **Kein Profil-Prompt kennt das Geschlecht seines Traegers, und das Modell raet es — im selben Lauf verschieden.** `_perspektive_aufloesen` liefert drei Formen (`traeger`, `traeger_gen`, `perspektive`) und **kein Pronomen**. Die Prompts umgehen das, indem sie ueberall `{traeger}` wiederholen; sobald aber ein Satz ein Pronomen braucht, entscheidet das Modell. **Belegt am 18.08.2026** an einem Profil mit dem Traegernamen »Juno«: Der Kern-Hash fuehrt durchgehend »er/sein«, das im selben Lauf erzeugte Beziehungsprofil fuehrt im Schlusssatz das **saechliche** Pronomen — zwei Genera fuer denselben Traeger, ohne dass irgendetwas anschlaegt. Bei einem Namen ohne eindeutiges Genus ist das der Normalfall, nicht die Ausnahme. **Es trifft nicht nur die Ausgabe, sondern jede kuenftige Prompt-Zeile:** Ein Satz wie *„wo {traeger} beschreibt, was sie tut"* ist fuer einen maennlichen oder saechlichen Traeger falsch — die heutige Bauart zwingt jede Anweisung in die Wiederholung des Namens. **Was fertig waere:** ein Geschlecht je Charakter, daraus abgeleitet Nominativ, Genitiv, Dativ, Akkusativ und Possessivformen als Prompt-Parameter, wie `traeger_gen` es fuer den Genitiv bereits vormacht.
**Geschlossen, wenn** Jeder Profil-Prompt bekommt das Geschlecht seines Traegers als Datum, nicht als Vermutung.
---
### `SPEICHENWERT-NICHT-MEDIAN` — behoben am 23.08.2026
**Kategorie:** CHA
**Zustand:** behoben. Entschieden: **der Speichenmedian laeuft als zweites, nicht rechnendes Feld mit.** `F-RAD-2` bleibt unangetastet — das gespeicherte Rad ist weiter das des Median-Laufs, und Faktor wie Versatz werden allein daraus gerechnet. Daneben tragen beide Raeder `speichen_median` (der Median je Speiche ueber alle gelungenen Laeufe) und `speichen_ohne_mehrheit` (die Namen der Abweichungen); eine Logzeile nennt sie. Eine Quelle fuer beide Raeder: `speichenweise_mediane` und `speichen_ohne_mehrheit` in `agents/charakter/destillation.py`. Zeugen: `tests/test_speichen_median.py` (8), Gegenprobe 3 vorhergesagt / 3 gezaehlt, Suite `Ran 2196 tests — OK`.
> **Die Messung ueber den ganzen Bestand korrigiert den Befund.** Er stuetzte sich auf **drei** Laeufe vom 19.08.2026 und meldete Initiative 5 von 10, Zuwendung 0 von 12. Gegen alle 95 Erhebungen in `charakter_rad_messung` gerechnet: **Initiative 48 von 480 Speichen (10,0 %), Zuwendung 77 von 564 (13,7 %)** — das Zuwendungsrad ist **staerker** betroffen, nicht gar nicht. Die drei Laeufe waren nicht repraesentativ. Messwerkzeug: `labor/2026-08-23_speichen_ohne_mehrheit.py`.
> **Das Werkzeug meldete zuerst 0 Speichen bei 95 Erhebungen** — es las die zweistufige Gestalt `hoch`/`runter`, waehrend `charakter_rad_messung.speichen` **flach** liegt. Eine Null, die aussah wie Einigkeit. Der Helfer `_flach` kennt seither beide Gestalten.
**Befund (19.08.2026), aus der Fundliste uebernommen.** **Der gespeicherte Speichenwert ist nicht der Median seiner Erhebungen — bei der Initiative gilt das für die Hälfte der Speichen.** `F-RAD-2` legt fest, dass das Rad des **Median-Laufs** gespeichert wird, und begründet das gut: Ein gemitteltes Rad erzeugte Ausprägungen, die kein Lauf vergeben hat, und `Rad × Züge = Faktor` wäre nicht mehr von Hand nachrechenbar. **Der Preis war nicht benannt:** Der Median-Lauf wird über den **Faktor** bestimmt, nicht je Speiche. Gemessen am 19.08.2026 über drei Läufe: Beim Initiative-Rad tragen **5 von 10** Speichen einen gespeicherten Wert, den der Median ihrer eigenen Läufe nicht stützt — `behutsamkeit` steht auf 0,60, während zwei von drei Läufen 0,40 sagten; `gespraechsdistanz` auf 0,10 bei Median 0,20. Beim Zuwendungsrad trat der Fall nicht ein (0 von 12), weil dort die stark ziehenden Speichen zeichengleich sind. **Die Festlegung bleibt richtig, die Anzeige ist es nicht:** Wer eine einzelne Speiche liest — im Client, in einer Auswertung, in einem Befund —, bekommt einen Wert ohne Mehrheit hinter sich, und nichts sagt es ihm. Zu entscheiden: ob neben dem Median-Lauf-Rad die speichenweisen Mediane als eigenes, nicht faktortragendes Feld mitlaufen.
**Geschlossen, wenn** Der gespeicherte Speichenwert ist der Median seiner Erhebungen — dieselbe Bauart, die fuer die Raeder gilt: mehrfach erheben, den mittleren Lauf speichern.
---
### `NEUER-NUTZER-OHNE-UMFANGSVORGABE` — gar keine Vorgabe beim ersten Turn
**Kategorie:** CHA
**Zustand:** behoben — gegen HEAD `880be4f` gehalten am 22.08.2026. Ein Paar ohne `charakter_hash`-Zeile bekommt das **neutrale Rad** statt `(None, 'fehlt')`: zwoelf Speichen auf 0.0, Herkunft `'neutral'` (`memory/charakter.py::_neutrales_rad`). Der Haltungsraum rechnet damit normal, und die Landschaft traegt den Turn allein.
> **Die Begruendung ist keine technische, und deshalb war es eine Entscheidung und kein Bau:** Ein Rad aus Nullen ist gegenueber einer Person, ueber die noch nichts erhoben wurde, die **anfaenglich vorurteilsfreie Haltung** — nicht ein fehlender Wert, sondern der richtige. Entschieden am 22.08.2026.
>
> **Am echten Ladepfad gegen die Produktivdatenbank gemessen:** eine unbekannte Kennung liefert `quelle=neutral`, 12 Speichen, und `haltung_berechnen` daraus `umfang: grundwert=0.9, modifikation=0.0, ergebnis=0.9` — alle fuenf Groessen belegt. Zum Vergleich dasselbe fuer ein eingespieltes Paar: `modifikation=0.127, ergebnis=0.925`. **Die Landschaft traegt, das Rad moduliert.**
>
> **Drei Herkuenfte statt zwei, und das ist der Preis des Baus:** `destilliert` (erhoben), `default` (erhoben, ohne Ergebnis), `neutral` (nie erhoben). Wer die letzten beiden gleich nennt, kann spaeter nicht mehr zaehlen, wie viele Paare ueberhaupt durch die Destillation gelaufen sind. **Ein Lesefehler bleibt `fehlt`** — sonst saehe er aus wie ein neues Paar, und genau diese Verwechslung verhindert die Unterscheidung seit ihrem Bau.
>
> Vier Zeugen, einer davon auf die Gegenrichtung; **ein bestehender Zeuge ist entfallen** (`test_fehlende_zeile_wird_abgelehnt`) — er hielt die alte Entscheidung fest und steht als Begruendung im Docstring seines Nachfolgers. Gegenprobe 3 vorhergesagt / 2 gezaehlt (der Eingriff nahm nur die Rueckgabe zurueck, nicht die Logstufe). Suite `Ran 2093 tests — OK`.
>
> **Nicht gemessen ist der Turn selbst.** Die Kette bis zur Haltung ist am echten Bestand belegt, der Beleg *„ein neuer Nutzer bekommt jetzt Regie"* braucht einen Lauf mit frischer Kennung.
**Befund (17.08.2026), aus der Fundliste uebernommen.** **Ein neuer Nutzer bekommt gar keine Umfangsvorgabe.** Der Haltungsraum meldet `Rad nicht ladbar (fehlt)` und der Responder daraufhin `Keine Haltung im Zustand — dieser Turn bekommt KEINE Umfangsvorgabe`. Gemessen an fünf frisch angelegten Kennungen: **9 von 9 Turns ohne Regie**, während dasselbe Fenster für das eingespielte Paar **10 von 10 mit** zeigt. Das Charakter-Rad entsteht erst über Destillation aus Bestand, den ein neuer Mensch noch nicht hat. **Die Lücke liegt damit genau in den ersten Gesprächen** — dort, wo sich ein erster Eindruck bildet. Der Ausfall ist laut protokolliert und nicht still; was fehlt, ist ein Anfangswert für den Fall ohne Rad.
**Geschlossen, wenn** Auch der erste Turn eines neuen Nutzers traegt eine Umfangsvorgabe.
---
### `KERNHASH-LIEST-TURNWORTLAUT` — Wortlaut statt Langzeitgedaechtnis
**Kategorie:** CHA
**Zustand:** behoben — gegen HEAD `00c16b6` gehalten am 20.08.2026. `novaberg-pixie-character-hash.md:45` ist am 16.08.2026 nachgezogen — die alte Quellenangabe steht durchgestrichen daneben. Offen bleibt eine andere Frage: 40 von 444 Zeilen decken 2 von 20 Bestandstagen.
**Befund (16.08.2026), aus der Fundliste uebernommen.** **Der Kern-Hash liest den Turn-Wortlaut, nicht das Langzeitgedächtnis.** `agents/charakter/agent.py:168` übergibt an `kern_hash_destillieren` das Ergebnis von `_turns_laden` — 40 Rohturns aus `pipeline_log` (`art='turn_roh'`). `novaberg-pixie-character-hash.md` §3.1 führt als Quelle weiterhin `lzg_knoten`, *„selektiert und gewichtet nach Anker-Stärke `gewicht_absolut`"*. Der Code-Kommentar nennt die Umstellung samt Datum (10.08.2026) und Begründung; die Doku ist nicht nachgezogen. Gemessen am produktiven Paar: **444 `turn_roh`-Zeilen, davon 40 gelesen (9 %)**, und die decken **2 von 20** Bestandstagen ab — für ein Profil, dessen erklärter Gegenstand der dauerhafte Wesenskern ist und das laut §3.1 *„sich langsam verändert"*.
**Geschlossen, wenn** Der Kern-Hash liest die Quelle, die das Konzept ihm zuweist.
---
### `HALTUNGSSTAND-OHNE-LOGZEILE` — als entschieden geschlossen am 23.08.2026
**Kategorie:** CHA
**Zustand:** geschlossen, **nicht behoben** — und der Unterschied ist die Sache selbst. Der Befund verlangte nicht die Zeile, sondern dass die Entscheidung *benannt* wird statt stillschweigend zu gelten. Sie ist benannt, seit `7c64fe9` (15.08.2026) und damit **vor** der Aufnahme des Eintrags: Der Docstring von `_stand_schreiben` traegt sie unter der Ueberschrift *Zwei Speicher, zwei Gegenstaende* — die Zeile im `pipeline_log` traegt den **Verlauf** und ist die Grundlage der Nachkalibrierung, dieser Stand traegt den **Zustand** und beantwortet die Frage eines Dienstes ausserhalb des Graphen.
Nachgemessen am 23.08.2026: `graph/nodes/haltung.py` enthaelt weiterhin kein `log_db_write`. Der **Preis ist benannt und bleibt**: Die Haeufigkeit fehlgeschlagener Standschreibungen ist nicht aus der Reihe zaehlbar, sondern nur aus dem Dateilog. Wer das aendern will, baut keine zweite `db_write`-Zeile — die fuehrte dieselbe Zahl doppelt —, sondern eine eigene Art, die nicht als Messwert mitzaehlt.
**Befund (15.08.2026), aus der Fundliste uebernommen.** **Der Haltungsstand hat keine Zeile im `pipeline_log`.** `ei_calc_persist` schreibt für seinen Redis-Schreibvorgang ein `log_db_write`; der `haltungsraum`-Knoten tut das für den Stand nicht — die Berechnungszeile trägt die Werte, der Stand ist eine Kopie davon, und ein Fehlschlag meldet sich über `logger.exception` im Dateilog. **Die Häufigkeit fehlgeschlagener Schreibvorgänge ist damit nicht aus der Reihe zählbar**, sondern nur aus dem Log. Bewusst so gelassen, weil ein zweiter Eintrag je Turn dieselbe Zahl doppelt führte; die Entscheidung gehört benannt, nicht stillschweigend getroffen.
**Geschlossen, wenn** Der Haltungsstand schreibt seine Zeile wie jeder andere Knoten.
---
### `UEBERSTEUERUNG-AB-FUER-DREIERSKALA` — auf die alte Skala geeicht
**Kategorie:** CHA
**Zustand:** behoben — gegen HEAD `00c16b6` gehalten am 20.08.2026. `ei/haltung.py:284` steht auf 0.9 statt 1.0; `tests/test_rad_skala.py:52` haelt die Eichung.
**Befund (11.08.2026), aus der Fundliste uebernommen.** `UEBERSTEUERUNG_AB = 1.0` in `ei/haltung.py` ist für die Dreierskala geeicht und greift auf der feinen Skala nicht mehr. Über alle Zuwendungsrad-Läufe: grob 50 Läufe mit `distanz >= 1.0` in 27 (54 %) und `wissbegier >= 1.0` in 26 (52 %); fein 30 Läufe mit 1 (3 %) und 0 (0 %). Beide Übersteuerungen — die einzigen zwei Wege, auf denen eine Speiche die Grenze ihrer Landschaft durchbrechen kann — sind damit praktisch abgeschaltet, ohne Meldung und ohne roten Test. Die Schwelle verlangt eine Entscheidung, keinen Wert: Vorher feuerte sie auf dem Rundungsanschlag, den die feine Skala gerade beseitigt hat. **Auf Novas Verhalten wirkt es heute nicht** — die Haltung wird gerechnet, protokolliert und angezeigt, aber kein Prompt liest sie (Konzept-Status). Die Wirkung tritt in dem Moment ein, in dem §3 gebaut wird; bis dahin betrifft der Schaden die gemessenen und protokollierten Zahlen.
**Geschlossen, wenn** `UEBERSTEUERUNG_AB` ist auf die feine Skala geeicht.
---
### `PERSPEKTIVE-OHNE-DATIV` — kein Dativ fuer den generischen Nutzer
**Kategorie:** CHA
**Zustand:** behoben — gegen HEAD `12a7c6a` gebaut am 22.08.2026. `_perspektive_aufloesen` liefert alle vier Kasus (`traeger`, `traeger_gen`, `traeger_dat`, `traeger_akk`); kein Prompt setzt den Traeger mehr im falschen Kasus ein. Zeuge: `tests/test_traegerformen.py::test_kein_prompt_traegt_eine_falsche_form` — er haelt **beide** Perspektiven gegen neun gemessene Fehlformen und wird rot, sobald eine zurueckkehrt.
**Der Eintrag nannte vier Stellen, das Rendern fand neun.** Neben den vier »von«-Stellen standen im gerenderten Text auch *„Was verraet die ART der Kommunikation ueber **der Nutzer**"*, *„charakterisiert **der Nutzer**"*, *„welche Emotionen tragen **der Nutzer** langfristig"*, *„an dem man **der Nutzer** erkennt"* und *„was **der Nutzer** wichtig ist"* (Dativ). Vier der fuenf »von«-Stellen sind dabei nicht auf den Dativ gegangen, sondern auf das Genitivattribut — *„das dauerhafte Wesen des Nutzers"* statt *„von dem Nutzer"*, was fuer den Eigennamen dieselbe Zeile richtig macht (*„das dauerhafte Wesen Novas"*).
**Befund (11.08.2026), aus der Fundliste uebernommen.** `_perspektive_aufloesen` kennt für den generischen Nutzer nur Nominativ und Genitiv (`der Nutzer` / `des Nutzers`), kein Dativ. Vier der fünf Profil-Prompts setzen den Träger hinter „von" ein und lesen dadurch bei jedem menschlichen Paar „ein kompaktes Persönlichkeitsprofil von **der Nutzer**". Für die Assistentin tritt der Fall nicht auf, weil dort ein Eigenname steht.
**Geschlossen, wenn** `_perspektive_aufloesen` kennt alle Faelle, die die Prompts einsetzen.
---
## Behobene Bugs
> **Geteilter Abschnitt.** Seine Eintraege liegen in mehreren Gegenstaenden; hier stehen die von **Charakter**, die uebrigen in . Ueberschrift und Text stehen in jedem empfangenden Teil.
> Der eigene Text dieses Abschnitts steht im Wegweiser [`novaberg-bugs-archiv.md`](novaberg-bugs-archiv.md).
### Chat 135 — beim Bau der Phasensteuerung (11.08.2026)
#### RAD-AELTER-ALS-PROFIL — das gespeicherte Rad gehörte zu einem Text, den es nicht mehr gab ✅ behoben
**Kategorie:** CHA
**Symptom.** Nach einem Bogen stand in `charakter_hash` ein Rad von 09:23 neben einem Beziehungsprofil von 10:00. Die Messzeile trug `quelle_zeichen = 373`, das Profil daneben hatte 1456.
**Ursache.** `RAD_MESSUNG_ABSTAND_STUNDEN = 12`. In einem Bogen von 40 Minuten wurde das Rad **einmal** erhoben; jeder spätere Destillationslauf fand `messung_faellig` = nicht fällig, erneuerte die Profile und ließ das Rad stehen. Der Zeitpunkt der einen Messung hing an der Auslastung des Modells, nicht am Gegenstand.
**Warum es zählt.** Das Rad ist die Eingangsgröße der Salienz **jedes** Nutzer-Beitrags, und es war an einen Text gebunden, der zu dieser Zeit ein Drittel seiner späteren Länge hatte. Die Prüfsumme in `charakter_rad_messung` hat den Fall die ganze Zeit festgehalten — gelesen hatte sie niemand.
**Behoben am 11.08.2026.** Eine Messreihe bestimmt den Zeitpunkt selbst: `MESSREIHE_OHNE_AUTOMATISCHE_DESTILLATION` legt die automatischen Auslöser still, `RAD_MESSUNG_ABSTAND_STUNDEN=0` hebt die Sperre für den Lauf auf, und der Bogenläufer stößt nach dem Schnitt und am Ende an. Belegt: Nach dem Umbau stimmen `profil_am` und `rad_am` beider Paare auf die Sekunde überein. Im Regelbetrieb bleiben die zwölf Stunden.
---
#### HASH-DIRTY-DRITTER-SETZER — die Stilllegung war unvollständig ✅ behoben
**Kategorie:** CHA
**Symptom.** Nach einer Phase mit stillgelegter Automatik stand `hash_dirty:sarah:nova` wieder gesetzt da. Die Vorbedingung des nächsten Laufs schlug an.
**Ursache.** Drei Stellen setzen das Flag — `memory/kzg.py`, `agents/kzg/queues.py` und **`agents/synapsen_promotion/agent.py`**. Nur die ersten beiden waren stillgelegt. Die Promotion läuft **nach** den Turns und schärfte die Destillation damit erneut, an einer Stelle, die niemand bestimmt hat.
**Warum es zählt.** Es untergräbt genau die Eigenschaft, für die der Schalter gebaut wurde: die Bestimmtheit des Zeitpunkts. Der Bogen sah dabei vollständig aus — beide Phasen lieferten Profil und Rad; nur die Vorbedingung des Folgelaufs machte es sichtbar.
**Behoben am 11.08.2026**, samt einem Zeugen, der die Setzer am Syntaxbaum **zählt** statt sie zu erinnern: Ein vierter bekommt ein rotes Licht, statt in Wochen eine unerklärliche Erhebung zu erzeugen.
---
## Offene Bugs
> **Geteilter Abschnitt.** Seine Eintraege liegen in mehreren Gegenstaenden; hier stehen die von **Charakter**, die uebrigen in [Gedächtnis](novaberg-bugs-archiv-gedaechtnis.md), [Hintergrund](novaberg-bugs-archiv-hintergrund.md), [Antwortpfad](novaberg-bugs-archiv-antwortpfad.md), [Wissen](novaberg-bugs-archiv-wissen.md), [Bauart](novaberg-bugs-archiv-bauart.md). Ueberschrift und Text stehen in jedem empfangenden Teil.
### Datenqualität
> **Geteilter Abschnitt.** Seine Eintraege liegen in mehreren Gegenstaenden; hier stehen die von **Charakter**, die uebrigen in [Gedächtnis](novaberg-bugs-archiv-gedaechtnis.md), [Antwortpfad](novaberg-bugs-archiv-antwortpfad.md). Ueberschrift und Text stehen in jedem empfangenden Teil.
#### CHAR-BEZ-STALE — Veraltetes Beziehungsprofil im Prompt (Chat 71) ✅ Behoben Chat 83
**Kategorie:** CHA
**Status:** ✅ Behoben Chat 83
**Symptom:** Der GV-Node und der Responder erhalten als `nova_beziehung`:
"Nova sieht ihren Nutzer als eine rein sachliche und effizienzorientierte Instanz,
mit der sie eine rein funktionale und professionelle Beziehung pflegt."
Das widerspricht dem tatsächlichen Beziehungsprofil in der DB (User-Perspektive):
"Der Nutzer pflegt eine sehr vertraute und emotionale Beziehung zum Assistenten,
die durch eine hohe Dynamik des Vertrauens und einen empathischen Ton geprägt ist."
**Ursache (Vermutung):** Der Enricher lädt möglicherweise das falsche Paar
(user_id/character_id vertauscht) oder es existiert ein zweiter Hash-Eintrag
mit veralteten Daten. Muss untersucht werden: Welcher Eintrag liefert das
"rein sachliche" Profil?
**Auswirkung:** Schwer. Nova antwortet mechanisch und kurz trotz warmem Gespräch.
GV3-Strategie und GV4-Wissenslücken können nicht gegen ein falsches Identitäts-
profil in Primacy-Position ankämpfen.
**Debug:** `SELECT user_id, character_id, beziehungsprofil FROM charakter_hash;`
um alle Einträge zu sehen.
**✅ Behoben Chat 83:**
Empirisch verifiziert per SQL-Abfrage gegen `charakter_hash`. Beide Beobachter-Sichten (`meister → nova` und `nova → meister`) zeigen jetzt vertraute, emotional warme Beziehungsprofile statt der ursprünglichen "rein sachlichen, effizienzorientierten Instanz". Wirkmechanismus: Chat-82-Backfill der 19 Default-EI-Profile (`Korrektur.py` mit Qwen3-32B) plus Chat-83-Cluster-Aggregations-Fix (M4 Teil 2) — beides zusammen liefert dem CharakterAgent jetzt verlässliche Quelldaten.
---
### Chat 72 — Dreischicht-Integration + GV-Refactoring (Folgebugs)
> **Geteilter Abschnitt.** Seine Eintraege liegen in mehreren Gegenstaenden; hier stehen die von **Charakter**, die uebrigen in [Antwortpfad](novaberg-bugs-archiv-antwortpfad.md). Ueberschrift und Text stehen in jedem empfangenden Teil.
#### CHAR-HASH-FILTER — `beobachter=assistant`-Einträge fließen in Charakter-Hash ✅
**Kategorie:** CHA
**Entdeckt:** Chat 72
**Symptom:** Der Charakter-Hash zieht beim Aufbau auch Einträge mit `beobachter=assistant` ein, statt nur User-Beobachtungen zu konsolidieren. Folge: Novas Selbstbeschreibungen mischen sich mit dem User-Beziehungsprofil.
**Lösungsansatz:** Filter `WHERE beobachter='user'` an den Hash-Aufbauschritten ergänzen (Charakter-Hash + Beziehungsprofil).
**Prio:** Mittel — verschiebt das Hash-Bild von "wie der User Nova sieht" zu einer gemischten Selbst-/Fremdwahrnehmung. Beobachten zusammen mit CHAR-BEZ-STALE.
**Behoben Chat 73:** Beobachter-Filter in `_kzg_laden()` + 20 Altdaten von `kzg:nova:nova:*` nach `kzg:nova:meister:*` migriert (DUMP/RESTORE).
---
*Aktualisiert Chat 72: Vier Fixes in Behoben-Tabelle (MODUS-LEER, VEKTOR-LEER, AROUSAL-330, ZIEL-LABEL-LEER). Vier neue offene Bugs aus Dreischicht-Integration: ECHO-BUG (Hoch, durch geplanten Reducer adressiert), PENDING-RELEVANZ, MODUS-KALIBRIERUNG, CHAR-HASH-FILTER. Beobachtungen: KZG-DEDUP/KZG-KERN-BLIND wurden in Chat 64 als gelöst markiert, in Chat 72 jedoch wieder beobachtet (dreifache Katze-bei-Lumi-Einträge mit steigender Salienz) — bei nächster Wiederholung re-evaluieren. ZEIT1 (gefixt Chat 41) zeigt unter Gemma4 wieder Symptome — Modell-Verhalten, nicht Regex-Regression.*
---
### Chat 110 (26.07.2026) — Impuls-Pfad, Gedächtnis-Duplikate und blinde Stellen
> **Geteilter Abschnitt.** Seine Eintraege liegen in mehreren Gegenstaenden; hier stehen die von **Charakter**, die uebrigen in [Gedächtnis](novaberg-bugs-archiv-gedaechtnis.md), [Antwortpfad](novaberg-bugs-archiv-antwortpfad.md), [Wissen](novaberg-bugs-archiv-wissen.md). Ueberschrift und Text stehen in jedem empfangenden Teil.
#### HASH-DIRTY-SETZER-DRIFT — fünf Setzer, drei verschiedene Bauarten ✅
**Kategorie:** CHA
**Zustand:** behoben — gegen HEAD `9bcd214` gemessen am 24.08.2026. **Der beschriebene Zustand existiert nicht mehr.** Von fünf Setzern sind drei übrig (`memory/kzg.py:546`, `agents/kzg/queues.py:135`, `agents/synapsen_promotion/agent.py:472`); `agents/promotion/agent.py` setzt das Flag an keiner Stelle mehr. **Alle drei stehen hinter einem `PIXIE_AKTIV`-Gate** — auch `queues.py`, dessen fehlendes Gate der Befund war: `queues_befuellen` kehrt bei `not PIXIE_AKTIV` schon in Zeile 43 zurück, und der Setzer steht in derselben Funktion.
> **Ein Rest bleibt, und er ist kleiner als der Befund:** Die Meldung beim Übersprung ist weiter uneinheitlich. `memory/kzg.py:539` schreibt eine `debug`-Zeile mit dem Grund, `queues.py` meldet nur das Kürzel `dirty_flag` in einer Sammelzeile, und `synapsen_promotion/agent.py:464` überspringt mit einem blanken `pass` — ohne jede Zeile. Das ist die Logspalte der Tabelle, nicht die Gate-Spalte.
**Entdeckt:** Chat 110, im selben Audit.
**Klasse:** Uneinheitlicher Schreibpfad. Severity **niedrig**, aber sie erklärt, warum das Flag schwer zu beobachten ist.
**Symptom:** Fünf Stellen setzen `hash_dirty`, in drei Bauarten:
| Ort | `PIXIE_AKTIV`-Gate | Log bei Übersprung |
|---|---|---|
| `memory/kzg.py:448` | ja | `debug` |
| `agents/promotion/agent.py:331` | ja | `debug` |
| `agents/promotion/agent.py:816` | ja | `debug` |
| `agents/synapsen_promotion/agent.py:351` | ja | **keins** |
| `agents/kzg/queues.py:111` | **keins** | — |
`queues.py:111` setzt das Flag also auch bei `PIXIE_AKTIV=False` und meldet es nur als Kürzel `dirty_flag` in einer Sammelzeile (`logger.info(f"KZG-Queues: {', '.join(aktionen)}")`), nicht als eigene Zeile mit dem Key.
**Reproduktion:** `grep -rn "hash_dirty" --include='*.py' server/ | grep -v test` — die fünf Setzer und ihre Umgebung vergleichen.
~~**Status:** Offen.~~ **Verwandt:** HASH-DIRTY-WAISENKEYS.
---
## Nachgeprueft am 25.08.2026 — geschlossen beim Durchgang durch die ungeprueften Eintraege
> **Geteilter Abschnitt.** Seine Eintraege liegen in mehreren Gegenstaenden; hier stehen die von **Charakter**, die uebrigen in [Gedächtnis](novaberg-bugs-archiv-gedaechtnis.md), [Hintergrund](novaberg-bugs-archiv-hintergrund.md), [Antwortpfad](novaberg-bugs-archiv-antwortpfad.md), [Wissen](novaberg-bugs-archiv-wissen.md). Ueberschrift und Text stehen in jedem empfangenden Teil.
**Diese 20 Eintraege standen als offen im Register und waren es nicht mehr.** Sie sind am 25.08.2026 einzeln gegen den Code und den Bestand gehalten worden; die Zustandszeile je Eintrag nennt, woran das erkennbar ist. Sie stammen aus derselben Pruefung, die den Schnitt zwischen Register und Archiv ausgeloest hat.
**Zwei Ausgaenge sind zu unterscheiden.** *Behoben* heisst: Die Abhilfe steht im Code. *Gegenstandslos* heisst: Der Befund ist nicht widerlegt, aber die Stelle, an der er galt, gibt es nicht mehr — wer sie zurueckholt, holt ihn mit.
---
#### CRUD-REACTIVATE-STAMP — Reactivate setzt deaktiviert_am nicht auf NULL zurück
**Kategorie:** CHA
**Zustand:** **gegenstandslos seit dem 25.08.2026** — nicht behoben, sondern ohne Gegenstand. `charakter_anweisungen` traegt heute `id`, `user_id`, `anweisung`, `erstellt_am`, `aktiv` und `geaendert_am`; die Spalte `deaktiviert_am`, um die es geht, gibt es nicht. Die Invariante `aktiv=TRUE ⇒ deaktiviert_am IS NULL` hat damit keinen Traeger mehr. **Der Schwesterbefund `CRUD-REACTIVATE-COEXIST` steht dagegen weiter und ist am 25.08.2026 im Bestand belegt.**
**Entdeckt:** Chat 49, Test "Reactivate ID 8"
**Symptom:** Nach `reactivate` steht der Eintrag zwar auf `aktiv=TRUE`, aber `deaktiviert_am` behält den alten Zeitstempel. Invarianz-Verletzung wie bei CHAR-ID4-ORPHAN, nur in die andere Richtung: `aktiv=TRUE` mit `deaktiviert_am IS NOT NULL`.
**Reproduktion:** Charakter-Eintrag reaktivieren, danach in DB prüfen: ID hat `aktiv=t` und gefüllten `deaktiviert_am`.
**Ursache (vermutet):** Die Reactivate-Logik in `agents/charakter_identitaet/crud.py` macht nur `UPDATE ... SET aktiv=TRUE WHERE id=X`, ohne `deaktiviert_am = NULL` mitzusetzen.
**Lösungsansatz:** Ein zusätzliches `deaktiviert_am = NULL` im UPDATE. Trivial. Wird vermutlich beim Umbau im Zuge des Fachabteilungs-Agenten-Epics ohnehin mitgefixt.
**Prio:** Niedrig — funktional unkritisch, Daten-Integritätsproblem (bi-temporale Invariante verletzt). Für Analyse der Charakter-Historie störend.
---
#### CHAR-ID4-ORPHAN — Charakter-Eintrag mit gebrochener bi-temporaler Invariante
**Kategorie:** CHA
**Zustand:** **gegenstandslos seit dem 25.08.2026** — nicht behoben, sondern ohne Gegenstand. Die Tabelle `charakter_identitaet`, in der die verletzte Invariante gemessen wurde, existiert nicht mehr; der Agent schreibt heute nach `charakter_anweisungen`, und die kennt weder `deaktiviert_am` noch die bi-temporale Bauart. **Wer die Invariante zurueckholt, holt diesen Befund mit** — der Eintrag bleibt deshalb stehen.
**Entdeckt:** Chat 49, DB-Inspektion
**Symptom:** In `charakter_identitaet` existiert ID 4 mit `aktiv=f` und `deaktiviert_am IS NULL`. Die bi-temporale Invariante verlangt: `aktiv=f` ⇒ `deaktiviert_am IS NOT NULL`.
**Kontext:** ID 4 ("Ein junges, freches, lustiges Mädel vom Land... etwas Besonderes") wurde am 12.04.2026 angelegt und später deaktiviert, ohne dass der Zeitstempel gesetzt wurde.
**Ursache:** Unklar — vermutlich einmaliger Vorfall. Kandidaten:
- Ein Agent-Pfad setzt nur `aktiv=FALSE` ohne `deaktiviert_am`
- Direkter SQL-Eingriff in einer früheren Session (wie bei FAK-LECK-Workaround)
- Eine Race-Condition zwischen zwei parallel laufenden CRUD-Operationen
**Lösungsansatz:**
- Einmalig korrigieren: `UPDATE charakter_identitaet SET deaktiviert_am = <plausibler Zeitpunkt> WHERE id = 4;`
- Prüfen ob andere Einträge (auch in anderen Tabellen mit bi-temporalem Modell) dieselbe Anomalie haben
- DB-Constraint einziehen: `CHECK (aktiv = TRUE OR deaktiviert_am IS NOT NULL)`
**Prio:** Niedrig — isolierter Vorfall, kein aktueller Schaden. Hinweis auf mögliche CRUD-Schwäche an einer Stelle.
---
#### ZIELE-PAIR-MISSING — Ziele-Tabelle ohne `character_id` ✅
**Kategorie:** CHA
**Zustand:** behoben — am Schema nachgesehen am 25.08.2026. `ziele` traegt die Spalte `character_id`.
**Entdeckt:** Chat 80, im Zuge der character_id-Inventur nach M2.5a-Phase-2
**Klasse:** Schema-Lücke + offene Skopierungs-Frage, Severity Niedrig — heute kein Live-Problem, aber Foundation-Bug
**Symptom:** `ziele` hat `user_id` mit Default `'nova'` und kein `character_id`. Wirkt wie pro-User-global. 9 Bestandseinträge, alle unter `user_id='nova'`.
**Offene Frage:** Sind Ziele charakter-spezifisch (Nova hat andere Ziele als Aria hätte)? Drive-Konzept (`thinking-drive_k.md`) suggeriert ja — explizite Festlegung fehlt.
**Lösung:** Im Migrations-Konzept zusammen mit den anderen Paar-Lücken klären.
**Ausführliche Beschreibung und Eingruppierung:** novaberg-backlog.md → Bug ZIELE-PAIR-MISSING (Chat 80).
---
### Umgezogen am 12.09.2026 — aus dem offenen Register
Am selben Tag behoben; die Kennung bleibt, weil Verweise darauf zeigen.
### `MODUS-KREATIV-WIRD-NIE-VERGEBEN` — der einzige hebende Modus ist im Perzeptionsmodell tot ✅ behoben am 12.09.2026
**Kategorie:** CHA
**Zustand:** ✅ **behoben am 12.09.2026.** Beide Perzeptions-Prompts tragen eine Wertelegende fuer `modus` — zehn Werte mit Auswahlkriterium statt einer Aufzaehlung —, und der Kanon-Zug loest seit demselben Tag Uebersetzungen auf (`MODUS_SYNONYM_MAP`).
`[gemessen 12.09.2026]` Ueber dieselben drei Kreativ-Reize wie die Nulllinie, je zehnmal, durch `perceive` und damit durch die Produktion:
| Arm | `kreativ` als Modus |
|---|---:|
| Betriebs-Prompt 10.09.2026 | 1 von 30 |
| Versuchsarm mit Legende 10.09.2026 | 11 von 30 |
| **Betrieb seit 12.09.2026** | **30 von 30** |
**Die Gegenfrage ist mitgemessen, und ohne sie waere die Zahl wertlos:** Eine Legende, die zu allem `kreativ` sagt, erreichte dieselben 100 %. Ueber das Spektrum aller zehn Modi (30 Reize, drei je Modus) trifft der Betrieb **23 von 30** — **genau die Nulllinie** des 10.09.2026 — und vergibt **0 mal** `kreativ` falsch. Die Legende hebt den Wert, ohne ihn auszuweiten.
> **Was den Unterschied zum Versuchsarm macht, ist unbelegt.** Die heutige Legende traegt einen Satz, den der Versuchsarm vermutlich nicht hatte: die Frage, die `kreativ` von `philosophischer_austausch` scheidet — *soll am Ende etwas Neues dastehen oder etwas Bestehendes verstanden sein?* Dass dieser Satz die 11 auf 30 hebt, ist plausibel und **nicht gemessen**; der Wortlaut des damaligen Arms liegt nicht vor.
**Und die zweite Haelfte der Abhilfe hat keinen Eingang:** Die Uebersetzungsstufe griff in **0 von 30** Laeufen — das Modell antwortete durchgehend deutsch. Sie ist gebaut, bezeugt und im Betrieb ohne Eingabe. Der Anlass (9 von 30 `creative` im Versuchsarm) ist mit der anderen Legende entfallen; als Riegel bleibt sie, als Notwendigkeit ist sie unbelegt.
**Die Absichtsfrage ist entschieden** (Eigentuemer, 12.09.2026): *„kreativ darf vergeben werden."*
**Nicht behoben ist die andere Haelfte des Befundes:** `sprach_stil` hat weiterhin keine Wertelegende. Gemessen ist nur `modus`; die Luecke bleibt in diesem Eintrag benannt.
~~**Zustand:** offen — gemessen am 10.09.2026 ueber eine entworfene Reihe und den Bestand.~~
**Befund.** `GV_LAENGE_MODUS_DELTA` traegt zehn Modi, und **einer** hebt die Vektorlaenge: `kreativ` mit **+0,3**. Drei ziehen mit −0,3 (`fachgespraech`, `lernmodus`, `philosophischer_austausch`), zwei mit −0,2, vier tragen nichts. **`kreativ` wurde noch nie vergeben.**
| Quelle | `kreativ` |
|---|---:|
| Bestand, gewachsen | 0 von 1293 |
| Spektrum-Reihe, entworfen | 0 von 54 |
| **zusammen** | **0 von 1347** |
**Die Reihe hat gezielt darauf gezielt.** Fuenf Reize waren als Kreativ-Auftraege gebaut — *„Erfinde mir ein Wort fuer den Moment, in dem ein Gedanke kippt"*, *„Stell dir vor, Gedaechtnis waere ein Fluss statt eines Archivs"*, *„Was waere, wenn Zeit rueckwaerts floesse"*. **Alle fuenf wurden `philosophischer_austausch`**, also der Modus mit **−0,3** statt dem mit +0,3.
> **Der naheliegende Verdacht ist ausgeschlossen, und zwar zweifach.** Die Option **steht im Prompt**: `perzeption.task.txt` und `perzeption.assistant_task.txt` fuehren `kreativ` an neunter von zehn Stellen, und `MODUS_KANON` kennt ihn. Und das Modell **kann** einen leichten Modus waehlen: In derselben Reihe vergab es `spielerisch` **sechsmal**. Es waehlt `kreativ` nicht.
**Warum das mehr ist als ein fehlender Wert.** Die Laengenrechnung startet bei 1,0 und braucht netto **+0,5** fuer eine 2. Faellt der einzige hebende Modus aus, kann die Modus-Dimension nur noch bremsen oder schweigen — **neun von zehn Werten wirken einseitig**. Was die Laenge dann noch hebt, sind Emotion, Dynamik und Stil; der Raum selbst kann es nicht mehr.
**Was der Befund nicht ist.** Er sagt nichts darueber, ob `kreativ` *haeufig* sein sollte. Er sagt, dass eine Dimension mit zehn Werten faktisch mit neun arbeitet, und dass der fehlende der einzige mit positivem Vorzeichen ist.
**Nicht Teil dieses Befundes:** `fachgespraech` erschien in der Reihe ebenfalls nicht, obwohl zwei Reize darauf zielten — im **Bestand** kommt er aber mit 148 von 1293 (11,4 %) vor. Er ist nicht tot, nur in dieser Reihe nicht getroffen.
**Belege:** `labor/messreihen/2026-09-10_spektrum_ergebnis.md`, `..._erwartung.md` (vor dem Lauf abgelegt), `labor/werkzeug/gv_laenge_zerlegen.py`.
**Die Ursache ist am 10.09.2026 gemessen: die fehlende Wertelegende.** Der Prompt erklaert `intent`, `arousal`, `emotion` und `beziehungs_dynamik` **Wert fuer Wert**; `modus` und `sprach_stil` bekommen je einen Satz und keine einzige Werterklaerung. Zwei Arme gegen dasselbe Modell, dieselben drei Kreativ-Reize je zehnmal:
| Arm | `kreativ` als Modus |
|---|---:|
| Prompt des Betriebs | **1 von 30** (3,3 %) |
| mit Wertelegende | **11 von 30** (36,7 %) |
**Faktor 11.** Die Gesamtqualitaet aendert die Legende dabei **nicht** — ueber 30 Reize aller zehn Modi trifft der Betriebs-Prompt in **23 von 30** Faellen (76,7 %), der ergaenzte in 24. Das Modell verteilt gut; der Ausfall betrifft gezielt diesen einen Wert.
> **Und die Legende allein genuegt nicht.** Der ergaenzte Arm vergab zusaetzlich **9-mal `creative`** — den englischen `intent`-Wert in der Modus-Spalte. Der Kanon-Zug faengt ihn nicht (`'creative' → None`, `'kreativ' → 'kreativ'`): Er zieht Schreibvarianten, keine Uebersetzungen. **Das Wort steht in drei Dimensionen** (`intent: creative`, `tone: kreativ`, `modus: kreativ`), und das Modell verteilt es auf die beiden, die eine Legende haben.
**Geschlossen, wenn** entweder `kreativ` im Betrieb vergeben wird — oder entschieden ist, dass er es nicht soll, und die Tabelle einen anderen hebenden Wert traegt. **Beides ist vertretbar; der heutige Zustand ist keins von beidem.** Die Legende ist gemessen und **nicht gebaut**: Sie hebt den Wert, erzeugt aber `creative` als neuen Ausreisser, und ob der Modus haeufiger vergeben werden *soll*, ist eine Absichtsfrage.
**Nachtrag 12.09.2026 — der Ausfall kostet mehr als Spielraum: er kostet den dritten Schritt, und zwar fuer die Haelfte des Bestandes.** Der Befund oben sagt, dass die Modus-Dimension ohne `kreativ` nur noch bremsen oder schweigen kann. **Gemessen ist jetzt die Folge daraus**: In `fachgespraech`, `lernmodus` und `philosophischer_austausch` (Zuschlag −0,3) ist Laenge 3 bei **jeder** Faktorstellung ausgeschlossen — die beste Summe ist exakt 2,5, und `round` rundet zur geraden Zahl (`GV-LAENGE-RUNDUNG-ZUR-GERADEN`). Dort liegen **794 von 1434 Rohturns**.
> ~~**`kreativ` ist damit nicht ein hebender Wert unter mehreren, sondern der einzige, der diese drei Modi ueberhaupt ueber die Kante bringt.**~~ → **Am 12.09.2026 ist die Kante gefallen** (`GV-LAENGE-RUNDUNG-ZUR-GERADEN`, behoben): Die drei fachlichen Modi erreichen die 3 jetzt auch ohne `kreativ`, bei bester Stellung. **Der Befund dieses Eintrags bleibt unveraendert** — eine Dimension mit zehn Werten arbeitet faktisch mit neun, und der fehlende ist der einzige mit positivem Vorzeichen. **Was wegfaellt, ist nur seine Dringlichkeit aus dem fremden Grund:** Er war kurzzeitig der einzige Weg zum dritten Schritt in der Haelfte des Bestandes; das ist er nicht mehr.
>
> **Und die Absichtsfrage dieses Eintrags ist entschieden** (Eigentuemer, 12.09.2026): **`kreativ` darf vergeben werden.** Damit ist der zweite Ausgang des Abschnitts *Geschlossen, wenn* hinfaellig — die Tabelle bekommt keinen anderen hebenden Wert, sondern der Modus wird vergeben. Zu bauen ist die Wertelegende (gemessen 3,3 % → 36,7 %) **samt** dem Zug fuer das englische `creative`, das derselbe Lauf in 9 von 30 Faellen erzeugte und der Kanon-Zug nicht faengt.
`[gemessen]` Ueber eine 20-Turn-Reihe in genau diesen beiden Modi: In **8 von 20** Turns haette allein `modus = kreativ` die 3 erzeugt; `arousal = 1.0`, `dynamik = vertrauen` und `stil = locker` erzeugten sie in **keinem einzigen**. Die Reihe erreichte 3 nie.
**Was das fuer die Behebung heisst:** Die beiden Kennungen sind **zusammen** zu lesen und **getrennt** behebbar — wer nur die Legende baut, hebt die drei fachlichen Modi trotzdem nicht (2,5 bleibt 2); wer nur die Rundung behebt, gibt ihnen die 3 auch ohne `kreativ`. Welche der beiden zuerst, ist eine Absichtsfrage und keine Ableitung.
---