- source_meta.py kennt jetzt den echten Bestand: Kategorien telegram (107 Quellen)
und x (40), Typen x_account und pdf_document. Die 10 nie belegten
Lagen-Kategorien und der ungenutzte Typ excluded sind raus.
- Pydantic-Pattern source_type um x_account ergaenzt, excluded raus.
Behebt 422 beim Speichern von 40 X-Account-Quellen.
- Modal-Selects (Typ, Kategorie, PDF-Kategorie) werden aus /api/sources/meta
befuellt statt hartkodiert. Submit sendet category/source_type nur noch,
wenn nicht leer. Behebt stilles Loeschen der Kategorie bei Telegram-Quellen.
- source_suggester: Import auf shared.agents.claude_client angepasst
(war im Portal seit jeher kaputt, Konvention wie source_classifier).
- Toter Code raus: POST /health/run-stream (147 Z. SSE-Duplikat),
runHealthCheck() im Frontend, excluded_counts-CTE + Sperren-Spalte
(immer 0), Trend-Delta (braucht 2 Runs, es gibt 1), Alignment-Chips
(source_alignments ist leer), doppeltes formatDateTime, redundanter
setupHealthTab-Listener, toter healthContent-Zugriff.
- Tests: Kategorien-/Typen-Sets neu gepinnt, Smoke-Karteileichen entfernt.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Neuer Reiter zwischen Audit-Log und Verbrauchsrechner, Anlass war die
Dashboard-Kachel API-Kosten gesamt, die nirgendwo hinführte (sie springt
jetzt hierher). Kennzahlen-Set nach Betreiber-Best-Practices für
nutzungsbasierte KI-Produkte (Kostenverlauf, Marge je Kunde, Betrieb).
- GET /api/statistik?months=N liefert alles in einem JSON. Kosten und
Läufe je Monat und Lagentyp (führende Quelle refresh_log mit
lückenlosem incidents-Join), Quellen-Split aus token_usage_monthly,
Erfolgsquote, normalisiertes Fehler-Ranking, Dauer je Typ, Wachstum,
MAU/DAU aus user_activity_days und je Organisation Ist-Kosten plus
Margen-Schätzung zu heutigen Sätzen (Recherche-Anlage zählt dreifach,
weil der Multi-Pass nur eine Log-Zeile erzeugt). Aggregation als pure,
unit-getestete Funktionen, Monatsachse lückenlos gefüllt, Mediane nur
über Läufe mit Kosten (Erfassung begann erst 03/2026).
- statistik.js injiziert sich selbst nach dem rechner.js-Muster,
Platzierung doppelt gesichert (Ladereihenfolge mit async=false plus
insertBefore). Charts als Inline-SVG ohne Bibliothek, eine Achse je
Chart, Hover-Titel mit großen Trefferflächen, Legenden, Serienfarben
je Theme mit dem dataviz-Palette-Validator geprüft (alle Checks PASS).
Zeitraum 6/12/Alles, Datenstand-Hinweis, ehrliche Fußnote unter der
Margen-Tabelle, Leerzustand für die junge Aktivitäts-Erfassung.
- Migration user_activity_days für die Portal-Staging-DB (auf Live legt
sie der Monitor an, dort läuft die Erfassung in get_current_user).
- 10 neue Unit-Tests plus Auth-Smoke für den Endpoint, 96 Tests grün
(die zwei bekannten shared-Import-Fehlschläge bestehen unverändert).
Gegenstück im Monitor: Commit d367c60 (Aktivitäts-Erfassung).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>