config.py: get_jwt_secret() wirft RuntimeError nur bei Nutzung,
nicht beim Import. Blog-Pipeline kann importieren ohne JWT_SECRET,
Monitor bleibt geschützt.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Beschreibungs-Textarea waechst automatisch mit dem Inhalt (min 80px).
Greift beim Tippen, nach Beschreibung generieren und im Edit-Modus.
Emdashes (U+2014) durch Doppelpunkte ersetzt.
Button wird beim Bearbeiten einer Lage korrekt aktiviert (Titel per
JS gesetzt loest kein input-Event aus). Im Create-Modus explizit
disabled nach form.reset().
Neuer raw_text Parameter in call_claude() umgeht den JSON-System-Prompt.
Haiku gibt direkt lesbaren Text zurück statt JSON-Objekte.
Gesamtes JSON-Parsing (_json_to_text, Markdown-Strip) entfernt.
Claude CLI gibt bei tools=None oft Antworten in Markdown-Code-Blocks
zurueck (dreifache Backticks json...Backticks). Diese werden jetzt vor
dem JSON-Parse per Regex entfernt.
Haiku gibt oft tief verschachtelte JSON-Objekte zurück statt reinem
Text. Neue _json_to_text() Funktion konvertiert beliebige JSON-Strukturen
rekursiv in lesbaren Fliesstext mit Aufzaehlungen.
call_claude erzwingt bei tools=None JSON-Output per System-Prompt.
Haiku wrapped den generierten Text dann in ein JSON-Objekt.
Fix: JSON parsen und erstes String-Feld extrahieren.
Hinweistext zur guten Beschreibung erscheint jetzt als Tooltip am
i-Icon neben dem Label, konsistent mit allen anderen Formularfeldern.
Tooltip-Text wechselt weiterhin je nach Typ (Live/Recherche).
KI-gestütztes Prompt Enhancement: Button generiert per Haiku aus dem
Titel eine strukturierte Beschreibung. Unterscheidet zwischen
Live-Monitoring (kompakte Vorfallsbeschreibung) und Recherche
(strukturiertes Briefing mit Schwerpunkten und Suchbegriffen).
- Neuer Endpoint POST /api/incidents/enhance-description
- Button erscheint für beide Lage-Typen, aktiv ab 3 Zeichen Titel
- Info-Hinweis wechselt je nach Typ mit Beispiel
- Spinner-Animation während der Generierung
3 automatische Durchläufe laufen nur wenn noch kein Briefing existiert
(erster Refresh). Folge-Refreshes machen wie bisher einen einzelnen
Durchlauf, um unnötige Token-Kosten zu vermeiden.
Research-Lagen (Tiefenrecherche) führen jetzt bei einem Klick auf
Aktualisieren automatisch 3 aufeinanderfolgende Refresh-Zyklen durch:
1. Breite Erfassung (initiale 4-Phasen-Recherche)
2. Vertiefung (andere Quellen, inkrementelle Analyse)
3. Konsolidierung (letzte Lücken, Fakten-Upgrade auf established)
Die Progress-Bar zeigt den aktuellen Durchlauf an (Durchlauf 1/3 etc.).
Cancel funktioniert zwischen und innerhalb der Durchläufe.
Adhoc-Lagen (Live-Monitoring) sind nicht betroffen.
Bei Klick auf Aktualisieren bleibt der Progress-Indikator aktiv,
auch wenn die Recherche in der Warteschlange landet. Statt einer
Warning-Meldung wird eine Info-Meldung angezeigt. Erneutes Klicken
bestaetigt, dass die Aktualisierung bereits in Bearbeitung ist.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bei Incidents vom Typ research wird in PDF und DOCX nun korrekt
"Analyse" statt "Lagebild" als Ueberschrift verwendet.
Fallback-Texte auf neutrale Formulierung geaendert.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
token_usage_monthly hat jetzt UNIQUE(org_id, year_month, source).
Monitor schreibt mit source=monitor, Globe mit source=globe.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Keine-Gedankenstriche-Regel in factchecker.py und researcher.py Prompts
- _sanitize_mdash() in claude_client.py als Sicherheitsnetz: ersetzt
alle mdash/endash im Output durch Kommas
- analyzer.py hatte die Prompt-Regel bereits
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Cursor bewegt sich jetzt zum sichtbaren Toggle-Switch statt zum
versteckten Checkbox-Input. Klick-Animation vor jedem Toggle.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Cursor bewegt sich jetzt zum sichtbaren Toggle-Switch statt zum
versteckten Checkbox-Input. Klick-Animation (Scale-Pulse) zeigt
die Betaetigung visuell an.
Neue Hilfsmethoden: _clickAtCursor() und _cursorToToggle()
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Lagebild auf ~4000 Zeichen gekürzt (scope=report), Hinweis auf Vollständigen Bericht
- Faktencheck: Top 20 im Lagebericht (alle im Vollständigen)
- Quellenstatistik: Top 20 im Lagebericht
- Quellenverzeichnis: Top 30 im Lagebericht, URLs kleiner (7pt) mit word-break
- Quellenreferenzen [1234] aus Text entfernt
- Sektionsreihenfolge: Exec Summary -> Faktencheck -> Quellenstatistik -> Lagebild
- Lagebericht jetzt ~8-10 Seiten statt 196
- /api/auth/verify-code Endpoint entfernt
- generate_magic_code() und VerifyCodeRequest entfernt
- VerifyCodeLimiter (Brute-Force-Schutz) entfernt (nicht mehr noetig)
- E-Mail-Template: Nur noch Anmelde-Link, kein 6-stelliger Code
- Login-Seite: Zeigt nach E-Mail-Eingabe Hinweis statt Code-Feld
- Magic Link Token-Verifikation via URL bleibt bestehen
Liefert Locations + Artikel-Headlines + Summaries als GeoJSON.
Flexible Lage-Auswahl per incident_id oder alle oeffentlichen.
Farbkodiert nach Kategorie (primary/secondary/tertiary/mentioned).
Wird als eigenstaendige Anwendung auf separater Subdomain neu aufgebaut.
Alle GEOINT-Dateien entfernt, dashboard.html/components.js/main.py
auf pre-GEOINT Stand zurueckgesetzt.
Router-Level on_event funktioniert nicht in FastAPI,
muss auf app-Level registriert werden. AISStream verbindet
sich jetzt beim Server-Start automatisch und sammelt
kontinuierlich Schiffspositionen (13.000+ global).