Ein echter Durchlauf auf bredelar.info deckte zwei Bugs auf, die mit
gemockten Tests unsichtbar waren:
1. Hang: attempt_timeout wurde nur als requests-Inaktivitäts-Timeout
übergeben. Ein Free-Modell, das die Verbindung offen hält oder Tokens
langsam tröpfeln lässt, umging ihn → der ganze Scan hing unbegrenzt
(real auf einem Bild >5 min). Fix: _post_with_deadline führt den Call
in einem Worker-Thread mit future.result(timeout=...) aus — hartes
Wanduhr-Limit, bei Überschreitung Eskalation statt Hang.
2. Verlust bei Abbruch: Das Ledger wurde nur ganz am Ende gespeichert,
ein Hang/Crash verwarf alle berechneten Verdikte. Fix: Zwischensicherung
nach der Textphase + im finally — Verdikte überleben einen Abbruch.
Zusätzlich attempt_timeout 30 → 20 s (flottere Eskalation).
Im erneuten Lauf griff der Deadline 4× sauber, der Scan lief vollständig
durch (Gelb: ein off_topic_commercial-Fund auf einer Gewerbe-Seite).
Tests: 239 grün (+2: Deadline kappt Hang <2s, Textverdikte überleben
Bildphasen-Crash).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>