feat: check-assets ↔ KI gekoppelt — byte-getauschte Bilder neu bewerten

Da bekannte Bilder aus Effizienzgründen nicht jeden Scan neu geladen werden
(url_hashes), prüfte die KI einen späteren Byte-Tausch eines bekannten Bildes
nicht von selbst erneut. Lücke geschlossen: Erkennt die Datei-Prüfung
(check-assets) eine geänderte Bilddatei, wird deren URL über
BaselineManager.invalidate_ai_url_hashes aus der Hash-Erinnerung entfernt →
nächster Scan lädt das Bild neu, neue Bytes = neuer Hash = Cache-Miss = die KI
bewertet den Inhalt neu.

Einhängung in cmd_scan (vor run_ai_analysis → Neubewertung noch im selben Scan)
und cmd_check_assets. Integritäts- und Inhaltsprüfung greifen so ineinander.

Tests: 260 grün (+2: invalidate entfernt nur die genannten URLs; geändertes
Bild wird nach Invalidierung neu geladen und beanstandet).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-06-13 04:22:38 +02:00
commit 78dc79ceab
4 changed files with 80 additions and 2 deletions

View file

@ -292,6 +292,22 @@ class BaselineManager:
json.dumps(state, indent=2, ensure_ascii=False), encoding="utf-8"
)
def invalidate_ai_url_hashes(self, urls: list[str]) -> int:
"""Entfernt URLs aus der url_hashes-Erinnerung. Folge: Die KI lädt diese Bilder
beim nächsten Lauf erneut und bewertet sie inhaltlich neu (geänderte Bytes
neuer Hash Cache-Miss Analyse). Wird von der Datei-Prüfung (check-assets)
für geänderte Bild-Assets aufgerufen. Returns Anzahl entfernter Einträge."""
if not urls:
return 0
ledger = self.load_ai_ledger()
uh = ledger.get("url_hashes", {})
removed = [u for u in urls if u in uh]
for u in removed:
del uh[u]
if removed:
self.save_ai_ledger(ledger)
return len(removed)
def dismiss_ai_entries(self, fingerprints: list[str] | None = None) -> int:
"""
Mark ledger entries as dismissed (false-positive acknowledgement).