From 4c024cd470eec0f83b94c1340a96662acde03480 Mon Sep 17 00:00:00 2001 From: claude-dev Date: Sun, 26 Jul 2026 02:10:04 +0000 Subject: [PATCH 1/2] docs: CLAUDE.md auf den echten Stand gebracht Korrigiert: DB-Pfad (/home/claude-dev/osint-data, nicht /mnt/gitea), Dienstname aegis-monitor.service, Ein-Prozess-Hinweis, Scheduler-Jobs vollstaendig, Pipeline-Reihenfolge (Faktencheck VOR Lagebild), Reiter-Ansicht statt gridstack, Tabellenliste vervollstaendigt (keine feedback-Tabelle, dafuer refresh_pipeline_steps, incident_events, fact_check_runs, billing_tariff, user_activity_days, system_status u.a.), Mandantentrennungs-Aussage praezisiert, Staging-DB-Pfad + .env-Realitaet, veralteter Workflow-Abschnitt ersetzt (Auto-Deploy laeuft laengst), erledigte offene Punkte raus, stattdessen ehrliche Baustellen-Liste Stand 26.07.2026, UI-Sync-Unterschiede in beide Richtungen aktualisiert. Co-Authored-By: Claude Fable 5 --- CLAUDE.md | 205 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 120 insertions(+), 85 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index dc4f21d..7a948c2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -10,9 +10,9 @@ url: https://monitor.aegis-sight.de server: ssh monitor (46.225.141.13, User: claude-dev) pfad: /home/claude-dev/AegisSight-Monitor quellcode: /home/claude-dev/AegisSight-Monitor/src/ -datenbank: /mnt/gitea/osint-data/osint.db (SQLite WAL, geteilt mit Verwaltungsportal + Globe) +datenbank: /home/claude-dev/osint-data/osint.db (SQLite WAL, geteilt mit Verwaltungsportal + Globe; data/ im Projekt ist ein Symlink darauf) gitea: https://gitea-undso.aegis-sight.de/AegisSight/AegisSight-Monitor -service: osint-monitor.service (systemd, Port 8891, Nginx Reverse Proxy) +service: aegis-monitor.service (systemd, Port 8891, Nginx Reverse Proxy, EIN uvicorn-Prozess - Orchestrator und WebSockets halten Zustand im Speicher, niemals --workers setzen) venv: /home/claude-dev/.venvs/osint/ (Python 3.12) ``` @@ -23,21 +23,21 @@ backend: framework: FastAPI + Uvicorn datenbank: SQLite WAL (aiosqlite, async) auth: Magic-Link-Login per E-Mail (JWT HS256, 24h) - scheduler: APScheduler (Auto-Refresh 1min, Cleanup 1h, Health-Check taeglich 04:00) + scheduler: APScheduler (PDF-Ingest 1min, Auto-Refresh 1min, Cleanup 1h, Health-Check taeglich 04:00, Telegram-Status taeglich 04:30) websocket: FastAPI native (Echtzeit-Updates an Clients) ki: Claude CLI als Subprocess (WebSearch + WebFetch Tools) ki_modelle: - schnell: CLAUDE_MODEL_FAST (Haiku) — Feed-Selektion, Geoparsing, Chat, QC - mittel: CLAUDE_MODEL_MEDIUM (Sonnet) — Entity-Extraktion, Netzwerkanalyse - standard: CLI-Default (Opus) — Recherche, Analyse, Faktencheck + schnell: CLAUDE_MODEL_FAST (Haiku) — Feed-Selektion, Topic-Filter, Geoparsing, Uebersetzung, Chat, QC + mittel: CLAUDE_MODEL_MEDIUM (Sonnet) — nur Netzwerkanalyse (entity_extractor hat aktuell keinen Aufrufer in der App) + standard: CLAUDE_MODEL_STANDARD (Opus) — Recherche, Lagebild, Faktencheck email: aiosmtplib (smtp.ionos.de:587 TLS) frontend: typ: Vanilla JS (kein Framework, kein Build-Step) design: AegisSight Dark/Light Theme (Navy/Gold) fonts: Poppins (Titel), Inter (Body) - layout: gridstack.js (Drag-and-Drop Dashboard-Kacheln) - karte: Leaflet + MarkerCluster + layout: Reiter-Ansicht je Lage (layout.js; gridstack wurde abgeloest, nur Legacy-Stubs uebrig) + karte: Leaflet + MarkerCluster (lokal in vendor/, Kacheln von tile.openstreetmap.de) echtzeit: WebSocket mit Auto-Reconnect und Ping/Pong ``` @@ -63,25 +63,35 @@ src/: feedback.py: "E-Mail-Feedback mit Bild-Anhaengen" tutorial.py: "Tutorial-Fortschritt pro User" + routes/: + version_router.py: "GET /api/version + /api/release-notes (OHNE Auth, fuer das Update-Fenster im Frontend). Historischer Zweitordner neben routers/" + agents/: - orchestrator.py: "Queue-basierte Refresh-Steuerung, Research Multi-Pass (3 Durchlaeufe), Retry, Cancel, Credits-Tracking" - researcher.py: "WebSearch-Recherche (Standard + 4-Phasen-Tiefenrecherche), Feed-Selektion, Keyword-Extraktion" - analyzer.py: "Analyse-Agent (Lagebild/Briefing, Erst- + inkrementell, Inline-Zitate)" - factchecker.py: "Faktencheck (Erst/Inkrementell/Zwei-Phasen mit Triage), Claim-Matching, Dedup" - geoparsing.py: "Haiku-basierte Ortsextraktion, Geocoding via geonamescache" - entity_extractor.py: "Netzwerkanalyse: Entity-Extraktion (Sonnet), Beziehungsanalyse, Dedup" - claude_client.py: "Shared Claude CLI Client, Usage-Tracking (Token, Kosten), Rate-Limit-Erkennung" + orchestrator.py: "Queue-basierte Refresh-Steuerung (eine Lane je Organisation), Research Multi-Pass (3 Durchlaeufe), Retry, Cancel, Credits-Buchung. _run_refresh ist ~1450 Zeilen, Aenderungen dort nur mit Vorsicht" + stage_runners.py: "Studio-Bausteine: analyze/factcheck einzeln auf vorhandenem Datenbestand, bewusst NEBEN _run_refresh gebaut" + researcher.py: "WebSearch-Recherche (Standard + 4-Phasen-Tiefenrecherche), Feed-/Kanal-/Account-Selektion, Keyword-Extraktion, Google-News-Suchfeeds je Sprache" + analyzer.py: "Analyse-Agent (Lagebild/Briefing, Erst- + inkrementell, Inline-Zitate, Topic-Filter, Neueste Entwicklungen, Stimmungsbild)" + factchecker.py: "Faktencheck (Erst/Inkrementell/Zwei-Phasen mit Haiku-Triage ab 25 Fakten), Claim-Matching, Dedup, Schutz gegen Massen-Downgrades" + geoparsing.py: "Haiku-basierte Ortsextraktion, Geocoding offline via geonamescache" + entity_extractor.py: "Netzwerkanalyse (Sonnet). ACHTUNG: aktuell ohne Aufrufer in der App, nur regenerate_relations.py im Repo-Root nutzt es" + translator.py: "Haiku-Uebersetzung in Batches a 5 (groessere Batches rissen den JSON-Output ab)" + claude_client.py: "Shared Claude CLI Client, Usage-Tracking (Token, Kosten), Rate-Limit-Erkennung, Cancel via ContextVar" feeds/: - rss_parser.py: "RSS-Feed-Parsing (feedparser + httpx), Keyword-Matching, Domain-Cap" - telegram_parser.py: "Telethon-basierter Telegram-Parser, Kanal-Validierung" + rss_parser.py: "RSS-Feed-Parsing (feedparser + httpx), adaptive Keyword-Schwelle, Frische-Bonus, Domain-Cap" + telegram_parser.py: "Telethon-basierter Telegram-Parser (eine gemeinsame Session), Kanal-Validierung" + x_parser.py: "X/Twitter via twscrape (Account-Store ~/.x-scraper/accounts.db, optional Mobilfunk-Proxy)" + podcast_parser.py: "Podcast-Feeds inkl. Transkript-Extraktoren (transcript_extractors/)" services/: - post_refresh_qc.py: "Post-Refresh Quality Check: Faktencheck-Duplikate, Location-Korrektur" - fact_consolidation.py: "Periodisches Haiku-Clustering, Auto-Resolve veralteter Fakten" - source_health.py: "Quellen-Health-Checks (Erreichbarkeit, Feed-Validitaet, Stale)" - source_suggester.py: "KI-Quellen-Vorschlaege via Haiku" - license_service.py: "Lizenz-Pruefung (Org, Ablauf, Nutzer-Limit)" + pipeline_tracker.py: "Die 11 Pipeline-Schritte (DE/EN, Laien-Tooltips), schreibt refresh_pipeline_steps + WebSocket-Events" + post_refresh_qc.py: "Post-Refresh Quality Check: Faktencheck-Duplikate, Location-Korrektur, Umlaut-Normalisierung" + fact_consolidation.py: "Periodisches Haiku-Clustering. ACHTUNG: als 6h-Job dokumentiert, aber NICHT im Scheduler eingeplant" + source_health.py: "Quellen-Health-Checks (Erreichbarkeit, Feed-Validitaet, Stale, fetch_strategy-Logik)" + source_suggester.py: "KI-Quellen-Vorschlaege via Haiku + Karteileichen-Heuristik" + pdf_ingest.py: "Minutenjob: hochgeladene PDFs einlesen (pdfplumber + OCR-Fallback), uebersetzen, als Pool-Artikel ablegen" + org_settings.py: "Key-Value-Einstellungen je Organisation (output_language etc.) mit 60s-Cache" + license_service.py: "Lizenz-Pruefung, Credits-Buchung (charge_usage_to_tenant), Periodenwechsel, Budget-Warnung. expire_licenses() existiert, hat aber KEINEN Scheduler-Job" middleware/: license_check.py: "Dependencies: require_active_license, require_writable_license" @@ -98,17 +108,25 @@ src/: report.html: "HTML-Template fuer PDF/DOCX-Export" static/: - index.html: "Login-Seite (Magic-Link)" - dashboard.html: "Hauptdashboard (Sidebar + GridStack + Modals)" + index.html: "Login-Seite (Magic-Link), JS inline" + dashboard.html: "Hauptdashboard (Sidebar + Reiter-Ansicht + 8 Modals + Chat-Widget)" + studio.html: "Studio (3-Spalten-Werkstatt, online nur fuer info@ sichtbar - Gating rein clientseitig)" css/: style.css: "AegisSight Design System (Dark/Light Theme, alle Komponenten)" + studio.css: "Studio-spezifische Styles" js/: - api.js: "REST-API-Client (fetch, Auth-Header, 30s Timeout)" - app.js: "Hauptlogik: ThemeManager, NotificationCenter, App-Objekt" - components.js: "UI-Rendering: Sidebar, Faktenchecks, Toasts, Progress-Bar, Karte" - chat.js: "Chat-Assistent Widget" - layout.js: "gridstack.js Wrapper (Drag/Resize, localStorage)" - tutorial.js: "Interaktiver 32-Schritte Rundgang mit Animationen" + api.js: "REST-API-Client (fetch, Auth-Header, 30s Timeout, 403 -> Nur-Lese-Modus)" + app.js: "Hauptlogik: ThemeManager, NotificationCenter, App-Objekt (181 KB)" + components.js: "UI-Rendering: Sidebar, Faktenchecks, Toasts, Progress, Karte (geteilt mit Studio)" + studio.js: "Kompletter Studio-Controller (109 KB)" + chat.js: "Chat-Assistent Widget (Bedienfragen)" + pipeline.js: "Grafische Analysepipeline (11 Schritte, Live-Animation)" + layout.js: "Reiter-Umschalter je Lage (merkt letzten Reiter; enthaelt noch gridstack-Legacy-Stubs)" + tutorial.js: "32-Schritte-Rundgang (140 KB). AKTUELL DEAKTIVIERT, alle Einstiege auskommentiert" + a11y.js: "Barrierefreiheits-Panel (identische Datei wie im Verwaltungsportal)" + update-system.js: "Was-ist-neu-Modal aus RELEASES.json + Update-Banner" + ai-disclaimer.js: "KI-Haftungshinweis beim ersten Besuch" + i18n.js: "Mini-Uebersetzung de/en (nur teilweise verdrahtet, Studio/Login komplett deutsch)" ws.js: "WebSocket-Client (Reconnect, Ping/Pong)" vendor/: leaflet.js: "Karten-Bibliothek" @@ -138,37 +156,51 @@ incident_typen: cancel: "Zwischen und innerhalb der Durchlaeufe moeglich" refresh_pipeline: - 1: "Feed-Selektion (Haiku) + dynamische Keywords" - 2: "Parallel: RSS + WebSearch + optional Telegram" - 3: "URL-Verifizierung (HEAD-Requests)" - 4: "Duplikaterkennung (URL + Headline)" - 5: "Relevanz-Scoring + DB-Dedup" - 6: "Geoparsing (Haiku + geonamescache)" - 7: "Parallel: Analyse + Faktencheck" - 8: "Post-Refresh QC" - 9: "Notifications (DB + E-Mail + WebSocket)" - 10: "Credits-Tracking (Token auf Lizenz buchen)" - 11: "Background: Source-Discovery" + hinweis: "Die 11 nutzersichtbaren Schritte definiert services/pipeline_tracker.py. Interner Ablauf in _run_refresh:" + 1: "Feed-/Kanal-/Account-Selektion (Haiku) + dynamische Keywords je Sprache" + 2: "Parallel sammeln: RSS + Google-News-Suchfeeds + WebSearch (Opus) + optional Telegram + X + Podcasts (nur adhoc)" + 3: "URL-Verifizierung (HEAD-Requests, tote URLs werden zu site:-Suchlinks repariert)" + 4: "Duplikaterkennung (URL + Headline, dann gegen DB-Bestand)" + 5: "Relevanz-Scoring + semantischer Topic-Filter (Haiku)" + 6: "Geoparsing (Haiku + geonamescache offline)" + 7: "Faktencheck ZUERST (liefert Faktenkontext), DANN Lagebild/Briefing (Opus). Optional Stimmungsbild aus Foren-Quellen" + 8: "Uebersetzung fehlender DE-Texte (Haiku, nur wenn TRANSLATOR_ENABLED) + Neueste Entwicklungen (nur adhoc)" + 9: "Post-Refresh QC (Fakten-Dubletten, Karten-Kategorien, Umlaute)" + 10: "Notifications (DB + E-Mail + WebSocket), Credits-Buchung (flat: adhoc 45 / research 40 je Durchlauf)" + 11: "Background: Source-Discovery + Executive Summary" -multi_tenancy: "Volle Mandantentrennung (tenant_id auf allen Tabellen)" +multi_tenancy: | + Mandantentrennung ueber tenant_id-Filter je Abfrage (keine Middleware). Bei Lagen zentral + ueber _check_incident_access. ACHTUNG, nicht alle Tabellen haben tenant_id + (source_health_checks, source_suggestions, incident_subscriptions, billing_tariff), + und der WebSocket-Broadcast filtert Stand 07/2026 NICHT nach Mandant. -dashboard_kacheln: - - "Lagebild (Markdown + Inline-Zitate)" +lage_reiter: + - "Neueste Entwicklungen (research: Zusammenfassung)" + - "Lagebild (research: Recherchebericht, Markdown + Inline-Zitate)" + - "Ereignis-Timeline (horizontale Achse, Bucketing, Filter)" + - "Geografische Verteilung (Leaflet, Kategorie-Marker, Legende)" - "Faktencheck (Status-Icons, Evidence, Filter)" - - "Quellenübersicht (nach Domain gruppiert)" - - "Timeline (horizontale Achse, Bucketing, Filter)" - - "Karte (Leaflet, Kategorie-Marker, Legende)" + - "Oeffentliche Stimmung (nur bei Foren-Quellen)" + - "Analysepipeline (grafisch, 11 Schritte)" + - "Quellenuebersicht (nach Domain gruppiert)" ``` -## Datenbank (25+ Tabellen) +## Datenbank (30+ Tabellen) ```yaml -kern: "organizations, licenses, users, magic_links, portal_admins" -lagen: "incidents, articles, incident_snapshots, fact_checks, refresh_log" -quellen: "sources, source_health_checks, source_suggestions, user_excluded_domains" +kern: "organizations, licenses, users, magic_links, organization_settings, portal_admins (gehoert dem Portal)" +lagen: "incidents, articles, incident_snapshots, fact_checks, incident_events, fact_check_runs" +pipeline: "refresh_log, refresh_pipeline_steps" +quellen: "sources, source_alignments, source_health_checks, source_suggestions, user_excluded_domains, podcast_transcripts" geo: "article_locations" -netzwerk: "network_analyses, network_analysis_incidents, network_entities, network_entity_mentions, network_relations, network_generation_log" -system: "notifications, incident_subscriptions, feedback, token_usage_monthly" +netzwerk: "network_analyses, network_analysis_incidents, network_entities, network_entity_mentions, network_relations, network_generation_log (alle leer, kein Endpoint im Monitor)" +abrechnung: "token_usage_monthly, billing_tariff, user_activity_days" +system: "notifications, incident_subscriptions, system_status" +hinweise: + - "Es gibt KEINE feedback-Tabelle, Feedback geht direkt per E-Mail raus" + - "Portal-Tabellen (portal_audit_log, portal_magic_links, source_health_history u.a.) liegen in derselben Live-DB, werden aber nur vom Verwaltungsportal angelegt/genutzt" + - "users.is_global_admin/globe_access/network_access legt NUR das Portal an. Eine frisch per init_db erzeugte Monitor-DB kann daher keinen Login (no such column)" ``` ## Verwandte Projekte (gleicher Server) @@ -199,7 +231,7 @@ regeln: - "Jede Aenderung MUSS sofort committed und nach Gitea gepusht werden" - "Echte Umlaute in UI-Texten (ue, ae, oe, ss), keine Umschreibungen" - "Keine Passwoerter oder Secrets in den Code committen" - - "Service nach Backend-Aenderungen: sudo systemctl restart osint-monitor" + - "Service nach Backend-Aenderungen: sudo systemctl restart aegis-monitor (Staging startet der Auto-Deploy selbst neu)" - "Frontend-Aenderungen (HTML/JS/CSS) brauchen keinen Neustart" - "Backup-Dateien (.bak) nicht committen, vor Push loeschen" ``` @@ -222,8 +254,13 @@ ui_sync: wortlaut: "Die Verbrauchseinheit heißt in BEIDEN Monitoren 'Credits' (Entscheidung Nutzer 2026-07-25). Nicht Guthaben, nicht Einheiten." gewollte_unterschiede: - "Online: Studio nur für info@aegis-sight.de freigegeben (Gating in studio.js init, Studio-Link im Dashboard-Header versteckt). Lokal ohne Gating, Knopf immer sichtbar." - - "Lokal: X-Zugänge-Oberfläche (twscrape) in Sidebar/Modal/Quellenübersicht. Online bewusst nicht vorhanden." - - "Lokal: Takt-Features (Untergrenze 30 Min, Kostenvorschau im Anlege-Dialog, Fork-Commit 5b0b578). Online noch nicht portiert. Die Credits-Abrechnung selbst ist seit 25.07.2026 auf beiden Seiten (docs/ABRECHNUNG.md)." + - "Lokal: X-Zugänge-Oberfläche (twscrape) in Sidebar/Modal/Quellenübersicht. Online bewusst nicht vorhanden (kein x-Router im Online-Backend)." + - "Lokal: Auto-Login über /api/auth/dev-login (Demo-Modus). Online ausschließlich Magic-Link." + - "Lokal: Kostenvorschau im Anlege-Dialog (updateIntervalCostHint, Fork-Commit 5b0b578). Online noch nicht portiert." + bekannter_drift_stand_2026_07_26: + - "Die Takt-Untergrenze ist inzwischen AUCH online (dort _getMinIntervalMinutes, 30 Min; lokal _intervalMinMinutes mit Vorgabe 12 Std). Ältere Angaben, sie fehle online, sind überholt." + - "Online-only, noch nicht in den Fork portiert: Reiter 'Öffentliche Stimmung' (renderPublicMood) und die Fall-Chat-Rückfrage /clarify." + - "Echter Inhalts-Drift in rund 11 Dateien (app.js, components.js, api.js, studio.js, style.css u.a.), weitere ~7 Dateien unterscheiden sich nur durch Umlaute in Kommentaren." stolperfalle_zeilenenden: | Die Frontend-Dateien (src/static) sind CRLF, die Python-Dateien dieses Repos sind LF (im Lokal-Fork teils anders). Beim Portieren keine Werkzeuge einsetzen, die Zeilenenden @@ -262,20 +299,22 @@ staging: zugriff: Magic-Link-Login an info@aegis-sight.de (Cookie 30 Tage) datenbank: - pfad: ~/AegisSight-Monitor-staging/data/osint.db + pfad: /home/claude-dev/osint-data-staging/osint.db (per DB_PATH in .env gesetzt) + achtung: "~/AegisSight-Monitor-staging/data/osint.db ist eine UNBENUTZTE Altkopie" initial: einmalige Kopie der Live-DB drift: gewollt - Aenderungen in Staging beeinflussen Live nicht reseed_von_live: | sudo systemctl stop aegis-monitor-staging - cp ~/AegisSight-Monitor/data/osint.db ~/AegisSight-Monitor-staging/data/osint.db + cp /home/claude-dev/osint-data/osint.db /home/claude-dev/osint-data-staging/osint.db sudo systemctl start aegis-monitor-staging besonderheiten_env: JWT_SECRET: eigener fuer Staging (nicht Live-JWT) MAGIC_LINK_BASE_URL: https://staging.monitor.aegis-sight.de (sonst leitet App zu Live) - TELEGRAM_API_ID: 0 # deaktiviert - verhindert Doppel-Login mit Live - TELEGRAM_API_HASH: 0 - DB-Pfad: relative aus config.py (nutzt automatisch ~/AegisSight-Monitor-staging/data/) + DB_PATH: /home/claude-dev/osint-data-staging/osint.db (Live setzt KEIN DB_PATH, dort greift der Default data/ = Symlink auf ~/osint-data) + STAGING_MODE: 1 (unlimited_budget, kein Credits-Hard-Stop) + TRANSLATOR_ENABLED: false + TELEGRAM_SESSION_PATH: ~/.telegram-staging/ (eigene Session, dort ist NIEMAND eingeloggt - Telegram-Recherche auf Staging liefert nichts, die Status-Karte im Portal zeigt das ehrlich an) auth_service: pfad: /opt/aegis-staging-auth @@ -288,33 +327,29 @@ staging: ### Workflow Staging -> Live -1. **Aenderung in develop machen** (im Staging-Verzeichnis): - ```bash - cd ~/AegisSight-Monitor-staging - git checkout develop - # Aenderung - git add . && git commit -m ... && git push origin develop - ``` +Der gueltige Ablauf steht unten unter "Vollstaendiger Workflow": develop pushen, +Auto-Deploy aktualisiert Staging von selbst, auf Staging pruefen, Promote ueber +https://deploy.aegis-sight.de, Live-Check. Manuelles git pull auf dem Server ist +NICHT noetig und sollte unterbleiben (der Deploy-Listener macht git reset --hard, +lokale Aenderungen in den Server-Verzeichnissen gehen dabei verloren). -2. **Staging aktualisieren** (aktuell manuell): - ```bash - ssh claude-dev@46.225.141.13 'cd ~/AegisSight-Monitor-staging && git pull && sudo systemctl restart aegis-monitor-staging' - ``` +Stolperfalle bei der Warteschlangen-Pruefung: das Staging-Verzeichnis fetcht per +Fetch-Regel NUR develop. Fuer "wie viele Commits warten auf Promote" immer erst +git fetch origin main ausfuehren, sonst zeigt main..develop veraltete Zahlen. -3. **In https://staging.monitor.aegis-sight.de testen** +### Bekannte Baustellen (Stand 2026-07-26) -4. **Promote zu Live**: Pull Request develop -> main in Gitea, dann: - ```bash - ssh claude-dev@46.225.141.13 'cd ~/AegisSight-Monitor && git pull' - # Live laeuft als loser uvicorn-Prozess (kein systemd) - manueller Restart - # bei Backend-Aenderungen noetig - ``` - -### Offen (noch nicht implementiert) - -- Auto-Deploy bei Push auf develop (Webhook-Listener) -- Promote-UI mit Ein-Klick-Button -- Live-Monitor auf systemd umstellen (~10s Downtime einmalig) +- WebSocket-Broadcast filtert nicht nach Mandant (main.py broadcast_for_incident bekommt tenant_id, nutzt ihn nicht) +- POST /api/public/globe-ingest schreibt ohne Eigentuemer-Pruefung in beliebige Lagen, Artikel ohne tenant_id +- fact_consolidation und expire_licenses existieren, haben aber keinen Scheduler-Job +- entity_extractor/Netzwerkanalyse ohne Aufrufer in der App (nur regenerate_relations.py) +- tutorial.js deaktiviert (Einstiege auskommentiert), laedt aber weiter bei jedem Login +- dashboard.html laedt nicht existierende cluster-data.js (404) und ungenutztes d3.js vom CDN +- Reiter "Oeffentliche Stimmung" fehlt in layout.js TAB_ORDER und ist dadurch nicht anklickbar +- X-Schalter im Anlege-Dialog hat online keine Funktion (kein X-Backend online) +- i18n unvollstaendig (Studio und Login nur deutsch), Begriffs-Mix Fall/Lage/Vorfall, zweimal "Token-Budget" statt "Credits" in app.js +- Unter 768px verschwindet die Sidebar ersatzlos (mobil unbenutzbar) +- Budget-Warnung geht nur in die Glocke, nicht per E-Mail (siehe docs/ABRECHNUNG.md) ## Auto-Deploy + Promote-UI From 59cd97adacfdf864602d0eabf9ac307694c9cc66 Mon Sep 17 00:00:00 2001 From: IntelSight_Admin Date: Sun, 26 Jul 2026 04:18:41 +0200 Subject: [PATCH 2/2] Release-Notes: Interne Verbesserungen --- RELEASES.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/RELEASES.json b/RELEASES.json index b7b9379..a30c0a5 100644 --- a/RELEASES.json +++ b/RELEASES.json @@ -1,4 +1,10 @@ [ + { + "version": "2026-07-26T02:18Z", + "date": "2026-07-26", + "title": "Interne Verbesserungen", + "items": [] + }, { "version": "2026-07-25T23:31Z", "date": "2026-07-25",