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>
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>
Neuer Router pricing.py (GET /api/pricing/cost-basis), liest die geteilte
Live-DB read-only und liefert Median-Kosten je Lagentyp plus Credit-Empfehlung.
main.py um den Router erweitert. Frontend rechner.js mit Reglern statt fester
Saetze und Empfehlungsanzeige je Aktion.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Neuer Sub-Tab "X-Recherche-Konten" unter Quellen: die X-Login-Konten,
mit denen der Monitor bei X scrapt (twscrape-Account-Pool), anzeigen,
hinzufuegen, Cookies erneuern, aktiv/inaktiv schalten, entfernen, plus
Sperren-Reset.
- neuer Router x_scraper.py, verwaltet den twscrape-Pool ueber dessen API
- X_ACCOUNTS_DB_PATH in config.py
- twscrape als Abhaengigkeit (git-main-Pin)
- Sub-Tab, Tabelle und zwei Modals in dashboard.html, Logik in x-scraper.js
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fremdsprachige Artikel ohne deutsche Fassung lassen sich jetzt manuell
über das Verwaltungs-Dashboard übersetzen. Hintergrund: die automatische
Übersetzung im Monitor wurde deaktiviert (TRANSLATOR_ENABLED=false),
nachdem ein sehr großer Lauf den Refresh-Worker blockiert hatte.
- translation_agent.py: Verwaltungs-Adaption des Monitor-Translators
(Haiku-Batches), Imports auf shared.agents.claude_client umgestellt
- routers/translation.py: Endpoints /api/translation/status, /run und
/cancel. Der Lauf läuft als entkoppelter Hintergrund-Task, blockiert
keinen Request und ist jederzeit abbrechbar
- Dashboard-Karte mit Fortschrittsbalken, Aufwandsschätzung vorab und
Abbrechen-Button
- test_imports.py: neuen Router in den Smoke-Test aufgenommen
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Schema-Migration: ON DELETE SET NULL fuer incidents.created_by, magic_links.user_id,
network_analyses.created_by (behebt 500er beim User-Loeschen). Neue Spalte
licenses.unlimited_budget. Neue Tabellen portal_audit_log, portal_login_attempts.
- Audit-Log: alle CREATE/UPDATE/DELETE auf Org/User/Lizenz/Quelle + Login-Events
werden mit before/after-Diff in portal_audit_log geschrieben.
- Brute-Force-Schutz: 5 Fehlversuche pro IP+Username/15min -> 429 mit Retry-After.
- Token-Budget: expliziter Schalter unlimited_budget pro Lizenz. UI zeigt ehrlich
>100%-Verbrauch (kein Math.min mehr) und ungebremste Anzeige bei unlimited.
- Neuer Audit-Log Tab mit Filter (Aktion/Ressource/Admin/Zeitraum) und Pagination.
- Neuer Tab "Quellen" mit Sub-Tabs "Grundquellen" und "Kundenquellen"
- Grundquellen: CRUD (Erstellen, Bearbeiten, Löschen) - gilt für alle Monitore
- Kundenquellen: Übersicht aller tenant-spezifischen Quellen mit Org-Zuordnung
- Kundenquellen können zu Grundquellen befördert werden
- Suche/Filter in beiden Ansichten
- Sources-Router mit vollständiger API
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>