- 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>
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>
Drei Pakete auf Nutzerwunsch.
1. Design-Angleichung an das AegisSight-Design-System. Navy/Gold-Token
statt Slate/Amber, Light- UND Dark-Theme mit goldenem Schiebeschalter
oben rechts (Dark = Standard, Wahl persistiert), Barrierefreiheits-
Panel über js/a11y.js (identische Datei wie im Monitor), echtes Logo
mit heller Plakette in Kopfzeile und Login, Poppins/Inter-Typografie,
Radius 6/8 nach Styleguide. Automatisch erzeugte Light-Theme-
Überschreibungen für alle Badge-Pastelltöne.
2. Lucide-Icons (Inline-SVG, keine externen Quellen) für alle
Navigations-Tabs inkl. nachgeladenem Verbrauchsrechner, die
Anlege-Knöpfe, Abmelden und Speichern.
3. Verbrauchs-Bereich aufgeräumt. Reiter heißt jetzt Verbrauch,
Statistik in Kundensicht (Credits) und Interne Kosten (Einkauf, USD)
getrennt, Leiste heißt Kontingent-Auslastung, Sätze-Infozeile mit
Sprung zum Verbrauchsrechner, Altmodus-Felder (USD) und die
Verbrauchs-Korrektur liegen in einem eingeklappten Bereich
Erweitert mit Erklärtext. Der Rechner trägt einen deutlichen
Simulations-Hinweis. Lizenz verlängern nutzt ein eigenes Modal
statt des Browser-prompt().
Cache-Buster auf 20260725 gebumpt, alle Restfarben tokenisiert.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bedienseite für das Credits-Monatskontingent des Monitors. Das Portal
setzt jetzt alle Stellwerte, der Monitor bleibt Herr der Laufzeitfelder.
- Lizenz-Modal und Budget-Formular um Abrechnungszeitraum (monthly/total),
Übertrag-Checkbox und Warnschwelle erweitert, Vorbelegungen auf das
beschlossene Modell (10.000 Credits, monatlich, Übertrag an, 0,20 USD).
- Neue Organisation kann direkt eine Lizenz mit Kontingent anlegen
(OrgCreate.license, verschachtelt). Org- und Lizenz-Insert laufen in
EINER Transaktion, schlägt der Lizenz-Teil fehl, entsteht keine
halbe Organisation. Gemeinsamer Helper insert_license_row statt
Duplikation der Widerruf- und Audit-Logik.
- PUT /api/token-usage/budget validiert credits_period (monthly|total)
und budget_warning_percent (1 bis 100), credits_rollover wird wie
unlimited_budget normalisiert. Laufzeitfelder bleiben bewusst
außerhalb der Whitelist.
- Overview und Org-Detail rechnen den Rest jetzt gegen verfügbar =
Kontingent + Übertrag, dieselbe Bezugsgröße wie der Hard-Stop im
Monitor. Neuer read-only Block Laufzeitwerte im Token-Subtab.
- Startup-Check loggt einen deutlichen Fehler, wenn die licenses-Tabelle
die Credits-Spalten noch nicht hat (falsche Deploy-Reihenfolge).
- Migration migrations/2026-07-25_credits_period.py (idempotent,
wortgleich mit der Monitor-Migration) für die Portal-Staging-DB,
auf Live gilt: Monitor VOR Portal promoten.
- 13 neue Modell-Tests, pytest grün (die zwei bekannten
shared-Import-Fehlschläge bestehen unverändert seit vorher).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
scripts/sync_shared.py: hält src/shared/ in sync mit dem Monitor-Repo
- --check: Drift-Diagnose ohne Schreiben (Exit 1 bei auto-sync-Drift, 0 bei
nur LOCKED-Drift = informativ)
- --apply: schreibt Drift, ueberspringt LOCKED_FILES
- Mojibake-Schutz via ftfy (Monitor-Originale haben teilweise noch Doppel-
Encoded UTF-8, das fixed wird beim Sync)
- Imports-Patch: from agents. -> from shared.agents. (etc.) damit Module
innerhalb von src/shared/ ihre Geschwister korrekt finden
LOCKED_FILES (nicht auto-syncbar):
- src/shared/services/source_health.py (Phase-2-Fork: tenant_id-Filter weg,
History-Archivierung, Config-Konstanten - waere im Monitor unsinnig)
Hintergrund: Phase 1 hat src/shared/ als 1:1-Kopie aus dem Monitor angelegt.
Phase 2 hat source_health.py spezifisch fuer die Verwaltung erweitert.
Ein blinder Sync wuerde Phase-2-Aenderungen ueberschreiben - Lock-Mechanismus
verhindert das, meldet aber Drift zur Information.
CLAUDE.md: Sektion Shared-Module-Sync mit Workflow-Doku.