fix(faktencheck): Belegtiefe zaehlt Medienhaeuser, Widerspruch ist keine Widerlegung
Block 2 der Auswertung des Ceuta-Vergleichs vom 01.08.2026. Der Faktencheck der
EU-Fassung zeigte dort drei Fehler, die alle dieselbe Wurzel haben: Der Status
behauptete eine Belegtiefe, die niemand nachgerechnet hat.
1. Die Zaehlung war kaputt. Das Muster fuer die Quellenzaehlung war
r'https?://' ohne den Rest der Adresse, findall lieferte also eine Liste aus
"https://"-Bruchstuecken und len(set(...)) ergab immer 1 oder 2. Daher stand
im Bericht eine Behauptung als BESTAETIGT mit 1 Quelle, obwohl vier Haeuser
in der Evidenz standen, und der gesamte Faktencheck der Anthropic-Fassung
wies durchgehend 1 bis 2 Quellen aus. Die Adresse wird jetzt vollstaendig
erfasst.
2. Gezaehlt wird nach Medienhaus, nicht nach Fundstelle. Sechs France24-Treffer,
davon vier Videofassungen derselben Meldung, sind ein Haus. Grundlage ist die
registrierbare Domain aus services/media_registry.py. Weiterleitungsportale
bekommen keine gemeinsame Identitaet, hinter news.google.com koennen
beliebige Zeitungen stecken. Nachgerechnet an Lage 53 sinken die Angaben von
9 auf 6, von 8 auf 4 und von 7 auf 5 Belege.
3. Neue Nachbedingung. pruefe_belegtiefe stuft jeden Fakt ab, dessen Status mehr
behauptet als vorliegt: confirmed braucht zwei, established drei unabhaengige
Haeuser. Ein Primaerbeleg (Originalzitat im Interview, amtliche Mitteilung,
Urteil) traegt allein, dafuer liefert das Modell jetzt "evidence_type". Damit
verschwindet auch die Unterkonfidenz der Gegenprobe, in der ein ZDF-Interview
als unbestaetigt galt, obwohl der Kritisierte dort selbst spricht.
4. Die Nachhak-Runde stuft "developing" nicht mehr hoch. Sie hatte die
Behauptung "Der Ausloeser ist weiterhin unklar" auf BESTAETIGT gesetzt, weil
developing in der Statusordnung die niedrigste Stufe ist. Eine Unklarheit
laesst sich nicht bestaetigen. Ausserdem rechnet die Runde die Belegzahl nach
dem Hochstufen neu und nimmt die Stufe zurueck, wenn die Belege sie nicht
decken.
5. Widerspruch und Widerlegung sind getrennt. "contradicted" meint laut Auftrag
Belege, die einander widersprechen, wurde aber als "Widerlegt" angezeigt. Im
Bericht stand deshalb die sachlich zutreffende Spanne von 50.000 bis 60.000
Grenzuebertritten als widerlegt, obwohl die Evidenz woertlich sagt "Die
Zahlen variieren je nach Quelle". Jetzt: contradicted = "Widersprüchlich",
der neue Status "false" = "Widerlegt" und setzt einen entkraeftenden Beleg
voraus. Angepasst in Bericht, Oberflaeche, beiden Sprachdateien, Farben und
Statusordnung.
6. Ein verbindlicher Regelblock haengt an jedem Faktencheck-Auftrag
(bewertungsregeln()): Unabhaengigkeit heisst verschiedene Medienhaeuser,
Agenturuebernahmen zaehlen einmal, unterschiedliche Zahlen verschiedener
Erhebungsstellen sind kein Widerspruch sondern eine Spanne mit Zuordnung,
und Aussagen ueber den Kenntnisstand ("Der Ausloeser ist unklar") sind keine
pruefbaren Behauptungen und gehoeren nicht in den Faktencheck.
Die Aenderungen wirken auf beide Modellwege. Die Fixtures in test_eu_factcheck
liefern jetzt Belege aus mehreren Haeusern, weil eine einzelne Quelle keine
Bestaetigung mehr traegt.
Nachgerechnet an beiden gespeicherten Laeufen: kein Fakt wird durch die neue
Nachbedingung abgestuft, die Belegzahlen werden aber durchgehend ehrlicher.
Neu sind 27 Pruefungen, insgesamt laufen 156 ohne Netzzugriff und ohne Kosten.
Offen: Die Oberflaechen-Aenderungen (components.js, app.js, style.css, i18n)
sind noch nicht in den Lokal-Fork portiert.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
@@ -93,7 +93,7 @@ src/:
|
||||
stage_runners.py: "Studio-Bausteine: analyze/factcheck einzeln auf vorhandenem Datenbestand, bewusst NEBEN _run_refresh gebaut"
|
||||
researcher.py: "WebSearch-Recherche (Standard + 4-Phasen-Tiefenrecherche), Feed-/Kanal-/Account-Selektion, Keyword-Extraktion, Google-News-Suchfeeds je Sprache"
|
||||
analyzer.py: "Analyse-Agent (Lagebild/Briefing, Erst- + inkrementell, Inline-Zitate, Topic-Filter, Neueste Entwicklungen, Stimmungsbild)"
|
||||
factchecker.py: "Faktencheck (Erst/Inkrementell/Zwei-Phasen mit Haiku-Triage ab 25 Fakten), Claim-Matching, Dedup, Schutz gegen Massen-Downgrades"
|
||||
factchecker.py: "Faktencheck (Erst/Inkrementell/Zwei-Phasen mit Haiku-Triage ab 25 Fakten), Claim-Matching, Dedup, Schutz gegen Massen-Downgrades. Belegtiefe: zaehle_medienhaeuser zaehlt unabhaengige Verlage statt Fundstellen, pruefe_belegtiefe stuft Fakten ab, deren Status mehr Beleg behauptet als vorliegt (confirmed 2, established 3, Primaerbeleg 1), bewertungsregeln() haengt den verbindlichen Regelblock an jeden Auftrag"
|
||||
geoparsing.py: "Haiku-basierte Ortsextraktion, Geocoding offline via geonamescache"
|
||||
entity_extractor.py: "Netzwerkanalyse (Sonnet). ACHTUNG: aktuell ohne Aufrufer in der App, nur regenerate_relations.py im Repo-Root nutzt es"
|
||||
translator.py: "Haiku-Uebersetzung in Batches a 5 (groessere Batches rissen den JSON-Output ab)"
|
||||
@@ -164,6 +164,7 @@ tests/:
|
||||
test_eu_belegsuche.py: "Gezielte Belegsuche ueber staan, Planung, Grenzen, Entdopplung, Ausfallverhalten"
|
||||
test_qc_und_runden.py: "Absicherung der Duplikatpruefung und Abbruch der Suchrunden bei erreichter Treffergrenze"
|
||||
test_mehrfachantwort.py: "Antworten, in denen sich das Modell selbst korrigiert und mehrere Fassungen liefert, die ausfuehrlichste muss gewinnen"
|
||||
test_faktencheck_belegtiefe.py: "Belegzaehlung nach Medienhaus, Nachbedingung fuer bestaetigte Fakten, Sperre gegen das Hochstufen von developing, getrennte Bezeichnungen fuer Widerspruch und Widerlegung"
|
||||
test_quellenausgabe.py: "Ausgabetreue des Quellenverzeichnisses: Nummern aus dem Lagebild statt Zeilennummern, keine Kappung, ein Verlag ein Name, Statistik deckungsgleich mit dem Verzeichnis"
|
||||
```
|
||||
|
||||
@@ -175,13 +176,13 @@ incident_typen:
|
||||
label: "Live-Monitoring"
|
||||
quellen: "RSS + WebSearch + optional Telegram"
|
||||
analyse: "Fliesstext-Lagebild"
|
||||
faktencheck_status: "confirmed/unconfirmed/contradicted/developing"
|
||||
faktencheck_status: "confirmed/unconfirmed/contradicted/false/developing (contradicted = Belege widersprechen einander, false = nachweislich widerlegt)"
|
||||
refresh: "Manuell oder automatisch (Intervall konfigurierbar)"
|
||||
research:
|
||||
label: "Recherche"
|
||||
quellen: "Nur WebSearch 4-Phasen-Tiefenrecherche (kein RSS)"
|
||||
analyse: "Strukturiertes Briefing (Ueberblick, Hintergrund, Akteure, Lage, Einschaetzung, Quellenqualitaet)"
|
||||
faktencheck_status: "established/unverified/disputed/developing"
|
||||
faktencheck_status: "established/unverified/disputed/false/developing"
|
||||
refresh: "Immer manuell, erster Refresh automatisch 3 Durchlaeufe (Multi-Pass)"
|
||||
multi_pass:
|
||||
durchlaeufe: 3
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren