Skip to content

Lenny — Tageslog 2026-08-07

Branch m0-perception, flag-gesichert + test-gated. Anlass: Chris' 2. QA-Runde (lenny_wissenstracking_2.md). Fortschritt sichtbar — viele Fragen aus Runde 1 sind von „dünn" nach „teilweise/geprüft" gewandert (die Runde-1-Fixes wirken).

Kernbefund Runde 2 (Chris' Befund 1)

Der deterministische „geprüft"-Pfad lieferte teils kaputte Ausgaben MIT dem STÄRKSTEN Vertrauens-Siegel — genau die gefährlichste Kombination: - #433 Lichtjahr: „ein LUZIFERjahr ist eine längenangabe" (Alias Licht→Luzifer mitten im Wort + unaufgelöste HTML-Entity). - #427 Mond: „einmondigphasenreiches satellit" (Wort-Salat als geprüft). - #423 Planet→Planet (Selbstreferenz, 2. Fall nach „Masse"). - Gegenbeispiel #461 Skulptur: geprüft UND sauber → der Pfad KANN gutes Output.

Umgesetzte Fixes (Commit 31f9b04, lokal — Push zurückgestellt)

Befund Fix Wo
#423 Planet→Planet (Selbstreferenz im Bestand) _weighted_fragment_answerbasis blockt fragment == suggestedmeaning. Der bisherige Filter griff nur bei NEUEN Kandidaten (normalize_learning_candidate), nicht bei Bestands-Kanten. ask_lenny.py
#433 ä HTML-Entity html.unescape() am Antwort-Chokepunkt (eine Entity im Text ist immer ein Bug). api_server.py
#427/#433 kaputtes Output mit geprüft-Siegel Output-Qualitäts-Gate (Chris' Vorschlag): wirkt die Ausgabe mechanisch kaputt (Rest-Entity oder Wort-Salat ≥20 Klein-Zeichen) UND trägt hohes Siegel → Downgrade auf Kandidat + Warnhinweis. „Im Zweifel Kandidat statt geprüft." api_server.py

Flags (Default an): LENNY_ENABLE_OUTPUT_QUALITY_GATE. Tests: tests/test_output_quality_gate.py (8), core/test_self_reference_answerbasis.py (3). Voller Lauf: 527 passed (1 unrelated Fail = fehlendes backups/…/ENDPOINTS_BEFORE.txt- Fixture, im git archive-Worktree nicht vorhanden — keine Code-Regression).

Nachtrag: Luzifer DOCH gefangen — die Invariante (Commit 330ab85)

Erste Einschätzung war falsch (Chris zu Recht korrigiert): ich hatte seinen VERWORFENEN Vorschlag (Wörterbuch-Abgleich) mit dem KORRIGIERTEN verwechselt. „Luziferjahr" ist morphologisch so sauber wie „Lichtjahr" — kein Lexikon/Wort-Salat- Detektor fängt das. Der korrigierte Vorschlag ist eine Invariante, die nur einen zur Abfragezeit ohnehin vorliegenden Wert braucht: den erfragten Begriff selbst. Frage „Was ist ein Lichtjahr?" → Antwort enthält „luziferjahr", aber nicht „Lichtjahr" → Ersetzung SICHER erkannt, unabhängig von sonstigem Unsinn im Satz. Umgesetzt als _queried_subject_term + Überlebens-Check im siegel-gesicherten Gate; konservativ auf eindeutige Einwort-Begriffe ab 6 Zeichen (Kompositum-Klasse), damit Umlaut-Flexion kurzer Wörter (Maus→Mäuse) keinen Fehlalarm auslöst. +6 Tests. Bleibt Symptom-Netz — die Wurzel ist Alias-Ersetzung auf Wortbestandteilen statt ganzen Begriffen.

KPI-Ereignis-Log (Chris-KI-Einwand, Commit 86d6aa0)

Eine nackte Zahlenreihe erlaubt keine Ursachenzuordnung. relation_diversity_report.py führt jetzt neben Messpunkten ein Ereignis-Log (--note "…"), mit dem KPI-Wert im Moment der Maßnahme gestempelt, chronologisch verschränkt. Live-Nulllinie gesetzt (2,58 %). +4 Tests.

Bewusst NICHT (noch) gefixt — ehrlich dokumentiert

  • Durchgehende Kleinschreibung (#440/#441/#467): kosmetisch; als Downgrade-Signal zu häufig (viele legitime Antworten starten klein) → bewusst KEIN Auto-Downgrade, sonst wird das Siegel inflationär entwertet. Besser im Renderer bei der Quelle lösen.
  • #451 Breitengrad→„Ekliptik": echter Sachfehler in den Daten, kein Rendering-Bug → gehört in die Evidenz-Pipeline, nicht in ein Output-Gate.

Deploy / Push

  • Lokal committet 31f9b04, live deployt via deploy.sh (git archive HEAD, Rebuild → ~1–2 h Embedding-Rebuild danach).
  • Push zurückgestellt (Marco: „der Push wird nach Fehlerverbesserung gemacht", „creds mach ich später sobald alles deployed ist"). Offen zum Pushen: a5cea0a (KPI Runde 1) + 31f9b04 (Runde 2).