feat(public-mood): Stimmungs-Kachel aus Foren-Quellen

Eigene Pipeline-Stufe nach factcheck, vor summary, die Foren-Artikel
(media_type='forum') zu einer Themen-Zusammenfassung verarbeitet. Wird als
separate Dashboard-Kachel "Öffentliche Stimmung" angezeigt — getrennt von
Lagebild und Faktencheck, damit anonyme Forenposts nicht mit belegter
Faktenlage verwechselt werden.

- DB-Migration: incidents.public_mood (TEXT) + public_mood_updated_at (TS).
- pipeline_tracker: neuer Pipeline-Step "public_mood" (DE/EN-Labels).
- analyzer.generate_public_mood: Haiku-Call der Foren-Beitraege pro Quelle
  gruppiert und 3-6 thematische Bullets erzeugt, mit expliziter Quellen-
  Herkunft pro Bullet. Bei zu duennem Material gibt's keinen Output.
- orchestrator: neuer Schritt zwischen Factcheck und Summary. Laedt alle
  Foren-Artikel der Lage (via JOIN auf sources), uebergibt sie an den
  Stimmungs-Agent, speichert den Markdown-Text in incidents.public_mood.
- Topic-Filter (analyzer.filter_relevant_articles) markiert Foren-Quellen
  mit [FORUM]-Tag und bekommt im Prompt die Regel, Foren-Artikel weicher
  zu bewerten (Lage-Keyword im Titel reicht). Sie sollen in der Stimmungs-
  Kachel landen, nicht voreilig verworfen werden.
- IncidentResponse-Modell: public_mood/public_mood_updated_at ergaenzt.
- Frontend: neuer Tab "Öffentliche Stimmung" (nur sichtbar wenn Inhalt da),
  eigene Kachel mit Warn-Hinweis "keine Faktenlage". UI.renderPublicMood
  als einfacher Bullet-Renderer.
- dashboard.html Cache-Buster fuer components.js + app.js gebumpt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
2026-05-22 00:20:17 +02:00
Ursprung 379d14518c
Commit d65f0180d9
8 geänderte Dateien mit 243 neuen und 3 gelöschten Zeilen

Datei anzeigen

@@ -32,6 +32,8 @@ _PIPELINE_STEPS_DE = [
"tooltip": "Aus den Meldungen werden Ortsangaben erkannt und auf der Karte verortet."},
{"key": "factcheck", "label": "Fakten prüfen", "icon": "shield",
"tooltip": "Behauptungen aus den Meldungen werden gegeneinander abgeglichen: Bestätigt? Umstritten? Noch unklar?"},
{"key": "public_mood", "label": "Stimmung erfassen", "icon": "message-circle",
"tooltip": "Aus Foren-Quellen (z.B. 5ch, Hatena, Note) wird ein Stimmungsbild der öffentlichen Diskussion extrahiert. Keine Faktenlage, sondern dominante Themen und Bruchlinien."},
{"key": "summary", "label": "Lagebild verfassen", "icon": "file-text",
"tooltip": "Aus allen geprüften Meldungen wird ein zusammenhängendes Lagebild geschrieben, mit Quellenangaben am Text."},
{"key": "qc", "label": "Qualitätscheck", "icon": "check-circle",
@@ -53,6 +55,8 @@ _PIPELINE_STEPS_EN = [
"tooltip": "Locations are extracted from the articles and placed on the map."},
{"key": "factcheck", "label": "Checking facts", "icon": "shield",
"tooltip": "Claims from the articles are cross-checked: Confirmed? Disputed? Still unclear?"},
{"key": "public_mood", "label": "Reading the mood", "icon": "message-circle",
"tooltip": "Forum sources (5ch, Hatena, Note, etc.) are summarised into a public-mood overview. Not factual, but dominant themes and fault lines."},
{"key": "summary", "label": "Writing the briefing", "icon": "file-text",
"tooltip": "All verified articles are combined into a coherent briefing with inline citations."},
{"key": "qc", "label": "Quality check", "icon": "check-circle",