Fix: Massen-Downgrade von Faktenchecks verhindern

Zwei Bugs behoben die dazu fuehrten, dass alle established Faktenchecks
bei einem inkrementellen Refresh auf unverified zurueckgesetzt wurden:

1. _format_existing_facts() uebergibt jetzt Evidence-Kontext an den LLM,
   damit bestehende Claims im inkrementellen Modus verifiziert bleiben.
2. Neuer Schutz im Orchestrator: Wenn >50% der established Fakten
   herabgestuft wuerden, werden die FC-Ergebnisse komplett verworfen.

Root Cause: Inkrementeller Faktencheck hatte nur Claims+Status aber
keine Evidence. Der LLM konnte bestehende Fakten nicht verifizieren
und gab unverified fuer alles zurueck.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
Claude Dev
2026-04-09 17:46:16 +02:00
Ursprung 678b72e7ff
Commit ac3fe5f22b
2 geänderte Dateien mit 29 neuen und 1 gelöschten Zeilen

Datei anzeigen

@@ -1180,6 +1180,30 @@ class AgentOrchestrator:
contradicted_count = 0
status_changes = []
# --- Schutz gegen Massen-Downgrades ---
# Wenn >50% der established/confirmed Fakten auf unverified/unconfirmed
# herabgestuft wuerden, verwerfe die FC-Ergebnisse komplett.
established_ids = {ef["id"] for ef in existing_facts if ef.get("status") in ("established", "confirmed")}
if established_ids and fact_checks:
from agents.factchecker import find_matching_claim
_downgrade_count = 0
_remaining_tmp = list(existing_facts)
for _fc in fact_checks:
_matched = find_matching_claim(_fc.get("claim", ""), _remaining_tmp)
if _matched and _matched["id"] in established_ids:
_new_st = _fc.get("status", "developing")
if _new_st in ("unverified", "unconfirmed", "developing"):
_downgrade_count += 1
_remaining_tmp = [ef for ef in _remaining_tmp if ef["id"] != _matched["id"]]
_downgrade_ratio = _downgrade_count / len(established_ids) if established_ids else 0
if _downgrade_ratio > 0.5:
logger.warning(
f"Faktencheck-Ergebnisse verworfen: {_downgrade_count}/{len(established_ids)} "
f"established Fakten wuerden herabgestuft ({_downgrade_ratio:.0%}). "
f"Bestehende Fakten bleiben unveraendert."
)
fact_checks = []
# Mutable Kopie für Fuzzy-Matching
remaining_existing = list(existing_facts)