"""B9 + B10 wiring — Multi-Entity-Impressum + Drittland-Mechanismus. Runs after B6/B7/B8. Adds Findings into `state["extra_findings"]` and re-renders the extra-block HTML. """ from __future__ import annotations import html import logging from compliance.services.ai_retention_granularity_check import ( check_ai_retention_granularity, ) from compliance.services.impressum_multi_entity_check import ( check_multi_entity_impressum, ) from compliance.services.transfer_mechanism_check import ( check_transfer_mechanism, ) logger = logging.getLogger(__name__) def run_b9b10(state: dict) -> None: extras = state.get("extra_findings") or [] new: list[dict] = [] new.extend(check_multi_entity_impressum(state)) new.extend(check_transfer_mechanism(state)) new.extend(check_ai_retention_granularity(state)) if not new: return extras.extend(new) state["extra_findings"] = extras state["extra_findings_html"] = _render(extras) logger.info("B9/B10 added %d findings (total extra=%d)", len(new), len(extras)) def _render(findings: list[dict]) -> str: cards = [] for f in findings: sev = (f.get("severity") or "").upper() color = "#dc2626" if sev == "HIGH" else ( "#f59e0b" if sev == "MEDIUM" else "#64748b" ) meta = "" if f.get("entities_missing"): meta = ("