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:
43
CLAUDE.md
43
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:<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
|
||||
|
||||
@@ -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); }
|
||||
|
||||
@@ -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 '';
|
||||
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren