feat(clustering): ajout features headers HTTP (Accept-Language, Accept-Encoding, Sec-Fetch, nb headers)
- SQL: LEFT JOIN sur view_dashboard_entities pour extraire la présence des headers
Accept-Encoding, Sec-Fetch-* et le nombre de headers par src_ip/ja4 (via subquery)
- SQL: ajout avg(ml.has_accept_language) depuis ml_detected_anomalies
- FEATURES: 23 → 27 dimensions
[23] Accept-Language (0=absent=bot-like)
[24] Accept-Encoding (0=absent=bot-like)
[25] Sec-Fetch-* (1=vrai navigateur)
[26] Nb Headers (normalisé /20; 3=bot, 15=browser)
- risk_score_from_centroid(): poids réajustés (somme=1.0), 4 nouveaux termes header
absence Accept-Language ×0.05, absence Accept-Encoding ×0.05,
absence Sec-Fetch ×0.04, peu de headers ×0.04
- name_cluster(): nouveau label 'Bot UA simulé' (ua_ch mismatch + sec_fetch absent)
et 'Scanner pur (no headers)' + 'Navigateur légitime' + 'Headless (no Sec-Fetch)'
- Fix: %% dans les LIKE ClickHouse (échappement paramètres Python %-format)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>