From ac3fe5f22bb3c1139227045204963b2a972d5dc1 Mon Sep 17 00:00:00 2001 From: Claude Dev Date: Thu, 9 Apr 2026 17:46:16 +0200 Subject: [PATCH] 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) --- src/agents/factchecker.py | 6 +++++- src/agents/orchestrator.py | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/agents/factchecker.py b/src/agents/factchecker.py index e12e2d1..2f5bff2 100644 --- a/src/agents/factchecker.py +++ b/src/agents/factchecker.py @@ -455,7 +455,11 @@ class FactCheckerAgent: status = fc.get("status", "developing") claim = fc.get("claim", "") sources = fc.get("sources_count", 0) - lines.append(f"- [{status}] ({sources} Quellen) {claim}") + evidence = (fc.get("evidence") or "")[:200] + line = f"- [{status}] ({sources} Quellen) {claim}" + if evidence: + line += f"\n Evidenz: {evidence}" + lines.append(line) return "\n".join(lines) async def check(self, title: str, articles: list[dict], incident_type: str = "adhoc") -> tuple[list[dict], ClaudeUsage | None]: diff --git a/src/agents/orchestrator.py b/src/agents/orchestrator.py index 884e114..7c58429 100644 --- a/src/agents/orchestrator.py +++ b/src/agents/orchestrator.py @@ -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)