feat(cookie+routing): Storage-Typ-Filter + legal_notice capture-only

#3 Storage-Filter: cookie-check exponiert per-Cookie-Speichertyp
(storage_inventory.per_cookie); CookieResultView bekommt Filter-Chips
(Cookie/Local Storage/Framework …) + eine Speicher-Spalte, Anbieter ohne
passenden Treffer werden ausgeblendet, KPI zeigt gefilterte Zahl.

A-Routing: legal_notice ist jetzt ein kanonischer Doc-Type. Eigene
Discovery-Regel (legal-disclaimer/rechtlicher-hinweis) VOR impressum →
die Disclaimer-Seite wird nicht mehr als Impressum substituiert (Ursache,
dass die Cross-Doc-Reconciliation nie zündete). capture-only: als
doc_entry für B persistiert, aber nicht einzeln gescort (keine 0%-Noise,
da ohne eigene Checkliste). Im Scan-Form als Option auswählbar.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-06-11 20:45:18 +02:00
parent 0f6cdc93fd
commit 97e39579d5
8 changed files with 137 additions and 11 deletions
@@ -81,11 +81,15 @@ def build_storage_inventory(vendors: list[dict]) -> dict:
"""Zählt je Speichertyp + liefert Beispiele für Nicht-Cookies."""
by_type: dict[str, int] = {}
examples: list[dict] = []
per_cookie: dict[str, str] = {}
for v in vendors or []:
vname = v.get("name") or "?"
for c in v.get("cookies") or []:
st = detect_storage_type(c.get("name", ""), c.get("expiry", ""))
by_type[st] = by_type.get(st, 0) + 1
n = (c.get("name") or "").lower()
if n:
per_cookie[n] = st
if st != "cookie" and len(examples) < 10:
examples.append({
"name": c.get("name", ""), "type": st, "vendor": vname,
@@ -98,6 +102,8 @@ def build_storage_inventory(vendors: list[dict]) -> dict:
"real_cookies": cookies,
"other_storage": total - cookies,
"examples": examples,
# name_lower → Speichertyp (für den Frontend-Filter).
"per_cookie": per_cookie,
}