Aenderungen:
- HARD_BUDGET_USD via env-var ueberschreibbar (Default 1.50).
- kein_bezug-Klassifikationen werden ebenfalls in claim_matches gespeichert,
damit der NOT-EXISTS-Filter in fetch_claims sie als verarbeitet erkennt und
Re-Runs nicht erneut Kosten erzeugen.
- backend /api/.../claims filtert kein_bezug aus match_counts und best_match
raus, sodass das Frontend nur sinnvolle Verbindungen anzeigt.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
scripts/match_answers.py (#17):
- Laedt offene Fragen (genuine, follow_up; answered='no').
- Embedded jede Frage und sucht den besten Kandidat-Absatz aus einer anderen
Episode (optional cross-podcast) per Cosinus-Aehnlichkeit ueber die paragraph-
embeddings.
- Bei score >= 0.55: Qwen-Verifikation 'Beantwortet B die Frage in A?'
(yes/partial/no), bei yes/partial wird answered + answered_by_* in der
questions-Tabelle gesetzt.
- Hard-Budget 1,50 USD, --rerun setzt bestehende Matches neu.
scripts/match_claims.py (#16 Stufe 2):
- Analoge Mechanik fuer claims: Embedding, Cosinus-Suche, Qwen-Verifikation
in der vier-stufigen Skala 'belegt' / 'widerspricht' / 'erweitert' / 'kein_bezug'.
- Schreibt Treffer (ohne 'kein_bezug') in neue Tabelle claim_matches.
- Default nur verifizierbare Claims (--include-non-verifiable kippt das),
--cross-podcast erlaubt Cross-Podcast-Treffer.
Beide Skripte nutzen json_utils.parse_llm_json fuer robustes Parsing und sind
gegen NaN-Vektoren in den Embeddings abgesichert.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>