Der Reiter X-Recherche-Konten heisst jetzt Recherche-Zugaenge und zeigt
oben eine Telegram-Karte: Session gueltig/Problem, verbunden als, Stand.
Die Daten meldet der Monitor (Commit 7dae63e) in die geteilte Tabelle
system_status, das Portal liest nur an (GET /api/x-scraper/telegram-status,
tolerant wenn Tabelle/Eintrag fehlt). Migration fuer die
Portal-Staging-DB liegt bei. Promote-Reihenfolge: Monitor VOR Portal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Die Vorschlags-Tabelle hat jetzt eine Checkbox-Spalte mit Alle-auswaehlen
(wirkt auf die gefilterten Zeilen) und zwei Knoepfe Ausgewaehlte annehmen /
Ausgewaehlte ablehnen. Noetig geworden, weil ein Pruefaluf hunderte
Vorschlaege erzeugen kann und Einzelklicks mit Dialog dann nicht praktikabel
sind. Neuer Endpoint PUT /suggestions/bulk nutzt exakt dieselbe
Entscheidungslogik wie der Einzel-Endpoint (gemeinsamer Helper
_apply_suggestion_decision, inkl. Auto-Reject und Duplikat-Schutz),
bereits erledigte IDs werden uebersprungen statt als Fehler gewertet.
Ein Audit-Eintrag pro Sammelaktion mit Zaehlern.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Echte Fehler:
- esc() maskiert jetzt auch Anfuehrungszeichen. Quellennamen mit
Apostroph (z.B. LExpress) brachen sonst die Zeilen-Knoepfe.
- formatDateTime parst SQLite-UTC-Zeitstempel jetzt als UTC statt
Lokalzeit (Zeiten waren um den Zeitzonen-Offset verschoben).
- Audit-Filter Bis-Datum schliesst den gewaehlten Tag jetzt komplett ein.
UI-Rueckmeldungen:
- Beschreibung in der Vorschlags-Tabelle bricht mehrzeilig um statt
abgeschnitten zu werden.
- Bestaetigen-Knopf im Dialog ist standardmaessig Gold, Rot nur noch bei
destruktiven Aktionen (Org/Nutzer/Quelle loeschen, X-Konto entfernen).
- Alle >= 0.85 genehmigen ist ausgegraut, solange keine Klassifikationen
ausstehen.
Konsistenz:
- GET /suggestions deckelt pending nicht mehr auf 50 (Badge und Tabelle
liefen auseinander), bearbeitete weiterhin letzte 50.
- /stats zaehlt jetzt alle Quellen wie die Liste (nicht nur aktive),
Grundquellen/Kundenquellen-Aufteilung wird immer angezeigt.
- Health-Spalte sortiert nach Schweregrad statt alphabetisch.
- Aufgaben-Badge laedt schon beim Seitenstart, nicht erst beim Reiterklick.
- Loesung-suchen-Knopf stellt nach Fehler das Icon wieder her, native
confirm()-Dialoge durch showConfirm ersetzt.
- Tote Endpoints GET /health (Alt-Liste) und GET /classification/stats
entfernt, tote CSS-Bloecke (activity-*, badge-health-*,
review-conf-filter) geloescht.
- Smoke-Test deckt jetzt alle Klassifikations-/Upload-/Sync-Endpoints ab.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- POST /api/sources/health/run (202, bei laufendem Run 409) stoesst den
Lauf als BackgroundTask an: eigene DB-Connection, run_health_checks +
generate_suggestions aus den geteilten Diensten, exakt nach dem Vorbild
des Monitor-Nachtjobs daily_source_health_check. Kein Code-Duplikat.
- GET /api/sources/health/run-status liefert den In-Memory-Status
(health_run.py, pure Funktionen mit Doppelstart-Sperre, unit-getestet).
Nach einem Neustart ist der Status idle, ein partieller Stand wird vom
naechsten Lauf archiviert und ueberschrieben (wie beim Nachtjob).
- Frontend: Knopf Jetzt pruefen + Zuletzt geprueft in der Stats-Leiste
der Quellenliste, Polling alle 4 s, Abschluss-Toast mit geprueft/
Probleme/neue Vorschlaege, danach Liste + Aufgaben-Badge neu laden.
Beim Oeffnen des Reiters wird ein laufender Run aus anderer Session
erkannt und weiterverfolgt.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Neuer Unterreiter Aufgaben buendelt Health-Vorschlaege (Tabelle inkl.
Loesung-suchen), Klassifikations-Review-Karten und den eingeklappten
Verlauf (erledigte Vorschlaege + letzte Prueflaeufe). Die dritte
Navigationsebene (healthSubTabs) entfaellt komplett.
- Badge zeigt die Summe aus offenen Vorschlaegen und ausstehenden
Klassifikationen, gespeist vom neuen billigen GET /api/sources/tasks/summary
(gleiche Bedingung wie /classification/stats, laeuft nie auseinander).
Badge laedt jetzt schon beim Klick auf den Quellen-Hauptreiter.
- aufgaben.js NEU (uebernimmt Vorschlags-/Verlauf-Rendering aus
source-health.js und den kompletten Klassifikations-Block aus sources.js),
source-health.js GELOESCHT (60s-Cache, Checks-Tabelle mit eigener
Pagination und Filtern entfaellt, die Details stecken jetzt als
Ausklapp-Zeile in der Quellenliste).
- Quellen hat damit 3 statt 5 Unterreiter: Quellenliste, Aufgaben,
X-Recherche-Konten.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- GET /api/sources mit scope=all|global|tenant ersetzt GET /global und
GET /tenant. Liefert org_name (LEFT JOIN organizations) und wie bisher
health_status + Artikel-Aktivitaet fuer ALLE Quellen.
- GET /global/stats wird GET /stats (zaehlt jetzt beide Herkuenfte,
neu by_origin und last_check), GET /global/languages wird GET /languages.
- PUT /global/{id} akzeptiert jetzt auch Kundenquellen (Guard ohne
tenant_id-Filter), damit der Deaktivieren-Knopf fuer beide funktioniert.
DELETE bleibt bewusst global-only.
- Neu GET /{source_id}/health fuer die Ausklapp-Details je Quelle.
- Frontend: EIN Render-/Filter-/Sortier-Pfad statt zwei (Tenant-Kette
komplett entfernt, ~200 Zeilen). Herkunfts-Filter, Organisations-Spalte,
Checkbox-Spalte + Bulk-Promote nur bei Herkunft Kundenquellen.
- Health-Badge ist klickbar und klappt eine gemeinsame Detailzeile aus
(Notizen + Checks mit Meldung und Zeitpunkt) mit Deaktivieren-Knopf.
Klickweg kaputte Quelle finden und deaktivieren: 3 statt 8 bis 10 Klicks.
- Unterreiter Kundenquellen entfaellt, erster Reiter heisst Quellenliste.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 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>