diff --git a/CLAUDE.md b/CLAUDE.md index ef5ec9d..c0c4e83 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -221,6 +221,49 @@ Changelog-Kategorien in TaskMate: - 35 = Changelog Website - 36 = Changelog TaskMate +## FIMI / Counter-Disinformation (Passiver Modus) + +Abgleich von Monitor-Artikeln gegen den EUvsDisinfo-Falschbehauptungsbestand, +vollstaendig im Monitor (kein Vigil-Call). Zweistufig: + +```yaml +stufe_1_embedding_vorfilter: + modell: sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 (384-dim) + service: src/services/embeddings.py (Lazy-Singleton, Modell-Cache ~/.cache/huggingface mit Vigil geteilt) + matcher: src/services/fimi_matcher.py (Claim-Embeddings als numpy-Matrix im RAM, Kosinus) + threshold: 0.55 Floor, 0.65 fuer Uebergabe an Stufe 2 + zweck: thematisch nahe Kandidaten finden (hoher Recall) +stufe_2_llm_verifikation: + modell: CLAUDE_MODEL_FAST (Haiku), tools=None + zweck: "verbreitet die Behauptung" vs. "berichtet/widerlegt" trennen (Embedding ist themen-, nicht haltungssensitiv) + ergebnis: nur bestaetigte Verbreitungen werden gespeichert, inkl. woertlichem Zitat + env: FIMI_VERIFY_ENABLED (default true), FIMI_VERIFY_CONCURRENCY (default 4) +daten: + tabelle_claims: fimi_claims (id=Vigil-claim.id, embedding-BLOB, source_ref euvsdisinfo:, case_url) + tabelle_treffer: article_fimi_matches (article_id, fimi_claim_id, score, role, matched_text) + marker: articles.fimi_checked_at (verhindert Re-Encoding gepruefter Artikel) + import: scripts/import_fimi_claims.py (Sync aus vigil-data/vigil.db, idempotenter UPSERT) +pipeline: + hook: orchestrator nach dem Translator-Schritt, nur neue Artikel des Refreshes (match_article_ids) +endpoints: + GET /incidents/{id}/fimi-matches: Treffer pro Artikel inkl. Provenienz (Andockpunkt 1) + GET /incidents/{id}/fimi-summary: Aggregat fuers Lagebild (Andockpunkt 3) + sources-summary: fimi_match_count pro Quelle (Andockpunkt 2) +frontend: + andockpunkt_1: dezenter Inline-Hinweis am Artikel (Quellen-Detailliste) + andockpunkt_2: Track-Record-Badge pro Quelle + andockpunkt_3: Qualitaetsleiste ueber dem Lagebild + aufklappbare Top-Narrative +rechtslage_euvsdisinfo: + quelle: EUvsDisinfo, Projekt des EEAS (East StratCom Task Force) + lizenz: Forschungsdatensatz CC BY-SA 4.0; EU-Inhalte mit Quellenangabe weiterverwendbar + pflichten: Attribution (Quelle + Case-Link), keine Verfaelschung, Disclaimer "keine offizielle EU-Position" + disclaimer_ort: Fusszeile der FIMI-Qualitaetsleiste (UI.fimiDisclaimerHtml) + Tooltip der Einzeltreffer + provenienz_leitplanke: Monitor wertet nie selbst, zeigt nur was EUvsDisinfo als widerlegt fuehrt +offene_punkte: + - Verifizierer-Prompt feinjustieren (seltene FP bei serioesen Medien, die ueber eine Aussage berichten) + - Per-Satz-Extraktion (Vigil Phase 2) als Praezisionsstufe optional nachruestbar +``` + ## Staging-Umgebung ```yaml diff --git a/src/static/css/style.css b/src/static/css/style.css index 891c518..33b2caa 100644 --- a/src/static/css/style.css +++ b/src/static/css/style.css @@ -6279,3 +6279,15 @@ body.tutorial-active .tutorial-cursor { } .fimi-claim-count { flex: 0 0 auto; font-weight: 700; color: var(--warning); min-width: 28px; } .fimi-claim-text { flex: 1 1 auto; } + +/* FIMI: Pflicht-Quellenhinweis EUvsDisinfo (dezent, gedaempft) */ +.fimi-disclaimer { + margin-top: 10px; + padding-top: 8px; + border-top: 1px solid rgba(245, 158, 11, 0.18); + font-size: 10.5px; + line-height: 1.4; + color: var(--text-disabled); +} +.fimi-disclaimer a { color: var(--text-secondary); text-decoration: underline; } +.fimi-disclaimer a:hover { color: var(--warning); } diff --git a/src/static/js/components.js b/src/static/js/components.js index 27cbe15..e4b6af9 100644 --- a/src/static/js/components.js +++ b/src/static/js/components.js @@ -1089,6 +1089,7 @@ const UI = { const passage = top.passage ? this.escape(top.passage) : ''; let tip = `Bei EUvsDisinfo als widerlegt geführte Behauptung: ${claimText}`; if (passage) tip += ` | Im Artikel: ${passage}`; + tip += ' | Quelle der Einordnung: EUvsDisinfo (EEAS East StratCom Task Force), keine offizielle EU-Position.'; const label = n === 1 ? 'Deckt sich mit einer von EUvsDisinfo widerlegten Falschbehauptung' : `Deckt sich mit ${n} von EUvsDisinfo widerlegten Falschbehauptungen`; @@ -1133,9 +1134,20 @@ const UI = { + ${this.fimiDisclaimerHtml()} `; }, + /** + * Pflicht-Quellenhinweis fuer EUvsDisinfo-Einordnungen. Dezent (kleine + * graue Fusszeile), aber praesent: Attribution an EEAS East StratCom + * Task Force + der offizielle Disclaimer, dass es keine offizielle + * EU-Position ist (Wortlaut der EUvsDisinfo-Veroeffentlichungen). + */ + fimiDisclaimerHtml() { + return `
Einordnungen aus der EUvsDisinfo-Datenbank des Europäischen Auswärtigen Dienstes (EEAS East StratCom Task Force). Sie beruhen auf Medienbeobachtung und Analyse der Task Force und stellen keine offizielle Position der EU dar.
`; + }, + renderSourceOverview(articles) { if (!articles || articles.length === 0) return '';