diag(cmp): log skipped CMP candidates with top-keys for Phase 0

VW & andere unbekannte CMPs liefern 603-Wort-Bug: kein Named-Matcher
greift, generische Heuristik filtert oder size_kb < 5 → cmp_cookie_text
bleibt leer → Backend faellt auf 603-Wort DOM-Navigation zurueck.

Neuer INFO-Log fuer jede JSON-Response >=3KB die als CMP-Kandidat
ueberlebt, aber Heuristik ODER Size-Schwelle nicht passt. Top-Keys +
URL + Size — beim naechsten VW-Run sofort sichtbar, welcher Endpoint
ein Named-Pattern braucht.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-22 10:28:57 +02:00
parent 6baf44ac84
commit 75174273f4
+17 -5
View File
@@ -80,21 +80,33 @@ class CMPCapture:
data = await _parse_json_response(response)
if data is None:
return
# Skip tiny payloads — real CMP cookie policies are ≥5KB.
# A 4KB JSON of cookie-shaped data is almost never the policy.
try:
size_kb = len(json.dumps(data)) // 1024
except Exception:
size_kb = 0
if size_kb < 5:
return
from services.cmp_heuristic import looks_like_cookie_policy
if looks_like_cookie_policy(data):
matched = looks_like_cookie_policy(data)
if matched and size_kb >= 5:
self.payloads.append(("_heuristic", data))
logger.info(
"CMP captured: _heuristic (%s, ~%dKB)",
url[:120], size_kb,
)
elif size_kb >= 3:
# Phase-0-Diagnose-Log: JSON-Response die als CMP-Kandidat
# ueberlebt hat, aber heuristic OR size-threshold abgelehnt
# wurde. Zeigt beim naechsten VW/BMW/... Run welche Endpoints
# uebersehen werden — schneller Pattern-Add ohne raten.
top_keys = []
if isinstance(data, dict):
top_keys = list(data.keys())[:8]
elif isinstance(data, list) and data and isinstance(data[0], dict):
top_keys = list(data[0].keys())[:8]
logger.info(
"CMP candidate skipped: url=%s size=%dKB heuristic=%s "
"top_keys=%s",
url[:120], size_kb, matched, top_keys,
)
except Exception as e:
logger.debug("CMP listener error: %s", e)