"""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 = ("
" f"Fehlt bei: " f"{html.escape(', '.join(f['entities_missing']))}" "
") elif f.get("vendor"): meta = ("
" f"Vendor: {html.escape(f['vendor'])} " f"({html.escape(f.get('country','?'))})" "
") elif f.get("doc_date"): meta = ("
" f"Stand: {html.escape(f['doc_date'])} " f"({f.get('age_years','?')} J. alt)" "
") elif f.get("detected_provider"): meta = ("
" f"Erkannter Provider: " f"{html.escape(f['detected_provider'])}" "
") elif f.get("evidence_dse"): meta = ("
" f"In DSE: {html.escape(', '.join(f['evidence_dse']))}" "
") cards.append( f"
" f"
" f"{sev} · {html.escape(f.get('check_id') or '')}
" f"
" f"{html.escape(f.get('title') or '')}
" f"
" f"{html.escape(f.get('norm') or '')}
" f"{meta}" f"
" f"→ Empfehlung: " f"{html.escape(f.get('action') or '')}
" "
" ) return ( "
" "

" "📌 Zusätzliche Cross-Doc-Befunde" "

" + "".join(cards) + "
" )