feat(fimi): EUvsDisinfo-Pflicht-Disclaimer + Doku

Rechtslage: EUvsDisinfo (EEAS East StratCom Task Force), Datensatz CC BY-SA 4.0.
Pflichten: Attribution (erfuellt via Case-Links), keine Verfaelschung, Disclaimer
"keine offizielle EU-Position". Disclaimer dezent als graue Fusszeile der
FIMI-Qualitaetsleiste (UI.fimiDisclaimerHtml) und im Tooltip der Einzeltreffer.
CLAUDE.md um FIMI-Abschnitt inkl. Rechtslage ergaenzt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
Claude Code
2026-06-14 09:55:35 +00:00
Ursprung f32b8a8ec6
Commit 8b84447ad4
3 geänderte Dateien mit 67 neuen und 0 gelöschten Zeilen

Datei anzeigen

@@ -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:<slug>, 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

Datei anzeigen

@@ -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); }

Datei anzeigen

@@ -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 = {
<button type="button" class="fimi-summary-toggle" onclick="App.toggleFimiDetail(this)">Narrative anzeigen</button>
</div>
<ul class="fimi-summary-claims" style="display:none;">${claimList}</ul>
${this.fimiDisclaimerHtml()}
</div>`;
},
/**
* 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 `<div class="fimi-disclaimer">Einordnungen aus der <a href="https://euvsdisinfo.eu/" target="_blank" rel="noopener">EUvsDisinfo</a>-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.</div>`;
},
renderSourceOverview(articles) {
if (!articles || articles.length === 0) return '';