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:
@@ -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]:
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren