- CSS-only Tooltip-System (.info-icon mit data-tooltip Attribut)
- Modal: Art der Lage, Internationale Quellen, Telegram, Sichtbarkeit, Aufbewahrung
- Dashboard: Faktencheck-Kachel (erklärt Status-Kategorien)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- RESEARCH_PROMPT_TEMPLATE: {existing_context} Platzhalter eingefügt
- search(): Baut bei Adhoc-Folge-Refreshes Kontextblock mit bis zu 30 bekannten Headlines auf
- orchestrator: Übergibt bestehende Artikel jetzt für ALLE Incident-Typen, nicht nur Research
Effekt: Bei Adhoc-Auto-Refreshes findet Claude WebSearch gezielt neue Quellen statt immer dieselben Mainstream-Treffer
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- DEEP_RESEARCH_PROMPT: 4-Phasen-Strategie (Breite Erfassung → Lückenanalyse → Gezielte Tiefenrecherche → Verifikation)
- Ziel 15-25 Quellen aus 5+ Quellentypen statt 8-15 aus Mainstream
- researcher.search(): Neuer Parameter existing_articles — bereits bekannte Quellen werden als Kontext übergeben, damit Claude gezielt neue Perspektiven findet
- orchestrator: DB-Abfrage vor Pipeline verschoben, bestehende Artikel als Kontext an Researcher übergeben (nur Research-Typ)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
4 feste Farbstufen (primary/secondary/tertiary/mentioned) mit
variablen Labels pro Lage, die von Haiku generiert werden.
- DB: category_labels Spalte in incidents, alte Kategorien migriert
(target->primary, response/retaliation->secondary, actor->tertiary)
- Geoparsing: generate_category_labels() + neuer Prompt mit neuen Keys
- QC: Kategorieprüfung auf neue Keys umgestellt
- Orchestrator: Tuple-Rückgabe + Labels in DB speichern
- API: category_labels im Locations- und Lagebild-Response
- Frontend: Dynamische Legende aus API-Labels mit Fallback-Defaults
- Migrationsskript für bestehende Lagen
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- CSS: min-height:0 und height:100% für Flex-Container
- JS: Höhe wird immer explizit aus der Gridstack-Kachel berechnet,
nicht nur als Fallback unter 50px
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Neuer Button zwischen Reload und Schließen. Toggled zwischen
normalem Fenster und Vollbild. Icon wechselt zwischen Expand/Collapse.
Schließen und Reset beenden Vollbild automatisch.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Invalid group reference \2 in re.sub entfernt (non-capturing group
hatte keine \2). Tags werden jetzt durch [tag] ersetzt.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Reload-Button (kreisförmiger Pfeil) neben dem Schließen-Button.
Wird erst sichtbar nach der ersten Nachricht. Setzt Konversation
zurück, leert den Verlauf und zeigt die Begrüßung erneut.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Zeigt "X Artikel aus Y Quellen" direkt im Header der Quellenübersicht-Kachel,
sodass die Info auch ohne Aufklappen sichtbar ist.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Lagebilder sollen so ausführlich wie nötig erstellt werden.
Alle 4 Templates (Analyse, Briefing, inkrementell) angepasst.
Inkrementelle Analyse behält nun alle Themenabschnitte bei
statt aggressiv zu kürzen.
Beim Re-Check eines Faktenchecks wurde die bestehende evidence nicht
aus der DB geladen (fehlte im SELECT). Dadurch konnte der Fallback-Code,
der alte URLs bewahren soll, nie greifen. Neue Evidence ohne URLs
überschrieb die alte mit URLs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Phasen haben nur noch Mindest-Floors (queued 2%, recherche 12%,
analyse 35%, faktencheck 65%), keinen Deckel mehr. Der Balken
kriecht global asymptotisch Richtung 95% (0.5% des Restwegs pro
500ms), sodass er nie stehenbleibt. Phasenwechsel geben sichtbare
Boosts nach oben, complete snappt auf 100%.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Balken kriecht jetzt asymptotisch innerhalb jeder Phase
(queued 2-10%, recherche 12-30%, analyse 33-60%, faktencheck 65-92%)
statt bei Phasenwechsel hart zu springen. 3% des Restwegs pro
500ms-Tick sorgt für gleichmäßige Bewegung unabhängig von der
Phasendauer.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Claude liefert bei der Analyse nur noch neue Quellen statt alle bisherigen
zu wiederholen. Der Merge mit bestehenden Quellen passiert deterministisch
im Code. Spart Tokens und verhindert das versehentliche Vergessen von Quellen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CORS-Origin und Magic-Link-URL von osint.intelsight.de auf monitor.aegis-sight.de
umgestellt. Claude CLI Pfad auf /usr/bin/claude aktualisiert.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bisher wurde bei Exit Code 1 nur stderr gelesen, wodurch Rate-Limit-Meldungen
auf stdout (als JSON) verloren gingen. Jetzt wird stdout zusätzlich geprüft und
Rate-Limit-Fehler als [rate_limit] geloggt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Analyse-Antworten von Claude wurden bei langen Outputs nicht korrekt
geparst, wodurch das Lagebild-Briefing eingefroren blieb. Neuer Parser
mit 4-stufigem Fallback: direktes Parsen, Regex-Extraktion,
Reparatur abgeschnittenes JSON, Regex-Fallback fuer Summary.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Automatischer QC-Schritt nach jedem Refresh:
- Erkennt inhaltliche Faktencheck-Duplikate via Fuzzy-Matching (Threshold 0.80)
- Korrigiert falsch kategorisierte Karten-Locations (z.B. entfernte Laender als 'target')
- Laeuft nach dem Faktencheck-Commit, vor den Notifications
- Fehler im QC blockieren nicht den Refresh-Ablauf
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rewrite feedback.py with correct MIMEMultipart(mixed) containing
alternative text part + base64-encoded image attachments.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- File input in feedback modal (max 3 images, 5 MB each)
- Frontend validation for file count and size
- Backend: multipart/form-data with UploadFile, MIME attachments
- Images attached to feedback email as base64-encoded attachments
- Only JPEG and PNG allowed (validated server-side)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- DEV_MODE flag in config.py (env var, default true for dev server)
- Log rotation: 5 MB max, 5 backups (RotatingFileHandler)
- DEBUG level in dev mode, INFO in production
- HTTP request logging middleware (dev mode only, skips static files)
- External library log levels suppressed (httpx, httpcore, uvicorn)
- Customer version: set DEV_MODE=false to disable verbose logging
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reset scrollTop on summary-content and factcheck-list containers
so scroll position from previous incident is not preserved.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevents brief flash of previous incident content (Lagebild,
Faktencheck, Quellen, Timeline, title) while new data loads.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The double-rAF callbacks from resizeTileToContent fire after the
initial scrollTop=0 reset. Add a scroll event listener that forces
scrollTop=0 during the entire rendering phase, then remove it after
3 animation frames (covering all double-rAF resize callbacks).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove grid-stack-animate class before rendering to prevent CSS
transitions from causing browser scroll-follow to repositioned tiles.
Re-enable animation after content is loaded and scroll is reset.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Der Scroll zum Faktencheck wurde durch den display:none->flex Wechsel
und/oder GridStack-Init ausgeloest. overflow:hidden wird jetzt ganz
am Anfang von selectIncident gesetzt, BEVOR das incident-view
sichtbar wird. Erst 500ms nach Abschluss aller Render-Operationen
wird overflow wiederhergestellt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Scroll-Event-Listener setzt scrollTop=0 bei jedem Scroll-Versuch
waehrend 500ms nach dem Laden. Verhindert zuverlaessig, dass
GridStack, Leaflet oder Fokus-Aenderungen den View verschieben.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
overflow:hidden bleibt 300ms nach loadIncidentDetail aktiv, damit
die verzögerten GridStack resizeTileToContent-Operationen keinen
Scroll zum Faktencheck ausloesen koennen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Statt den Scroll nach unten mit Timeouts zurueckzukaempfen, wird
overflow:hidden auf main-content gesetzt bevor das Rendering startet.
Nach Abschluss wird scrollTop=0 gesetzt und overflow wiederhergestellt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>