'use client' // Erklärendes Architekturschema des Compliance-Check-Tools — Muster aus dem // CE-Modul (/sdk/iace/.../architektur) übernommen: hand-kurierte Boxen/Pfeile + // Schritt-Akkordeon. Inhalt spiegelt den Code-Pfad (api/agent_check/_orchestrator // + services/specialist_agents). Bewusst statisch (der Doc-Check ist Python, hat // keinen Architektur-Endpoint wie das Go-IACE-Modul) — bei Bedarf später aus einem // Backend-Handler speisbar. import { useState, type ReactNode } from 'react' function Box({ title, sub, accent }: { title: string; sub?: string; accent?: 'purple' | 'amber' | 'green' | 'gray' }) { const c = accent === 'purple' ? 'border-purple-300 bg-purple-50/60 dark:border-purple-700 dark:bg-purple-900/20' : accent === 'amber' ? 'border-amber-300 bg-amber-50/60 dark:border-amber-700 dark:bg-amber-900/20' : accent === 'green' ? 'border-green-300 bg-green-50/60 dark:border-green-700 dark:bg-green-900/20' : 'border-gray-200 bg-white dark:border-gray-700 dark:bg-gray-800' return (
{title}
{sub &&
{sub}
}
) } function Lane({ label, children }: { label: string; children: ReactNode }) { return (
{label}
{children}
) } function Arrow() { return (
) } type Stage = { id: string title: string summary: string input: string logic: string source: string example: string } // Spiegelt run_compliance_check (Phasen A–F) + die Spezialagenten-Schicht. const STAGES: Stage[] = [ { id: 'a', title: 'Phase A — Auflösen & Crawl', summary: 'URLs + hochgeladene Dokumente einsammeln, fehlende Pflichtseiten automatisch finden.', input: 'Start-URL, Dokument-Uploads, 8 Wizard-Felder (scan_context)', logic: 'Discovery (Sitemap/Heuristik) + Fetch je Seite, Text-Extraktion pro Doc-Typ', source: 'consent-tester /dsi-discovery, Playwright', example: 'Findet /impressum, /datenschutz, /agb ohne manuelle Eingabe', }, { id: 'b', title: 'Phase B — Profil & Dokument-Checks', summary: 'Geschäftsprofil erkennen, jedes Dokument gegen seine Controls prüfen.', input: 'Doc-Texte je Typ + Business-Scope', logic: 'Regex-Runner + MC-Keyword + BGE-M3-Embedding + LLM-Verify (nur unscharf)', source: 'doc_check_controls (DB), mc_classification.db (Embeddings)', example: 'DSE: 267 Text-MCs, Keyword + semantischer Recall', }, { id: 'agents', title: 'Spezialagenten (nebenläufig)', summary: 'Pro Dokumenttyp ein typisierter Agent → eigener Ergebnis-Tab, gefüllt per SSE.', input: 'Doc-Text, Scope, scan_context', logic: 'Impressum + AGB + DSE laufen parallel (asyncio.gather), je ein AgentOutput', source: 'api/agent_check/_agent_outputs._TOPIC_AGENTS', example: 'AGB-Tab + DSE-Tab erscheinen, sobald ihr Agent fertig ist', }, { id: 'c', title: 'Phase C — Cookie-Banner', summary: 'Consent-Banner + gesetzte Cookies vor/nach Einwilligung live prüfen.', input: 'Live-Seite im Browser', logic: 'Consent-Tester-Scan: Banner, Vendors, Enforcement, Browser-Matrix', source: 'consent-tester /scan', example: 'Cookie vor Einwilligung gesetzt → Verstoß-Kandidat', }, { id: 'd', title: 'Phase D — Vendors & Plausibilität', summary: 'Dritt-Dienste extrahieren + Findings auf Plausibilität prüfen.', input: 'Banner-/Seiten-Daten, Findings', logic: 'Vendor-Extraktion (+OCR-Fallback), Plausibilitäts-Check je FAIL', source: 'Cookie-/Vendor-Kataloge, LLM-Kaskade', example: 'Analytics ohne Rechtsgrundlage → bestätigtes Finding', }, { id: 'reconcile', title: 'Cross-Finding-Abgleich', summary: 'Findings über Dokumente hinweg abgleichen — Doppel & Scheinverstöße auflösen.', input: 'Alle Modul-Findings', logic: 'Deckt ein anderes Dokument die Pflicht ab, wird das Cross-Finding unterdrückt', source: 'cross_doc_reconcile (B-Wirings)', example: '§36 VSBG im Impressum statt DSE → kein Doppel-Finding', }, { id: 'f', title: 'Phase E/F — Bericht & Snapshot', summary: 'Ergebnis persistieren, Snapshot für die Historie speichern.', input: 'Konsolidiertes Ergebnis', logic: 'Mail-Render + DB-Persist + Snapshot (Tab-Ansicht ohne Re-Crawl)', source: 'compliance_check_snapshots', example: 'Historie erneut öffnen, ohne die Seite neu zu crawlen', }, ] type ModuleEngine = { name: string; mechanism: string } const MODULES: ModuleEngine[] = [ { name: 'Impressum', mechanism: 'Scope-Gate + Feld-Matcher (§5 DDG / §18 MStV)' }, { name: 'AGB', mechanism: 'decision_method-Routing: Keyword → Geschäftsmodell-Gate → Embedding/Reference/LLM' }, { name: 'DSE', mechanism: '4-Layer: Regex-Boost → Keyword → BGE-M3-Recall (0.65) → Semantic-Validator' }, { name: 'Cookie-Banner', mechanism: 'Consent-Tester: Banner, Vendors, Enforcement, Browser-Matrix' }, ] type Pruefer = { method: string; mechanism: string; deterministic: string; example: string } // Meta-Modell: jede Pflicht → ein Prüfertyp (decision_method). Wenige // wiederverwendbare Prüfer statt Logik pro Control. const PRUEFER: Pruefer[] = [ { method: 'REGEX', mechanism: 'Kuratierte Muster / Keyword', deterministic: 'ja', example: 'Pflicht-Stichwort im Text' }, { method: 'EMBEDDING', mechanism: 'BGE-M3 Kosinus ≥ Schwelle', deterministic: 'ja (feste Funktion)', example: '„Recht auf Berichtigung" ≈ Umschreibung' }, { method: 'REFERENCE', mechanism: 'Link-/Verweis-Auflösung', deterministic: 'ja', example: 'Verweis auf die Datenschutzerklärung' }, { method: 'LLM', mechanism: 'Kaskade Qwen→OVH→Claude, nur unscharfe Fälle', deterministic: 'nein (eskaliert)', example: 'Speicherdauer inhaltlich erfüllt?' }, { method: 'BEHAVIOR', mechanism: 'Playwright: Live-Verhalten', deterministic: 'ja', example: 'Cookies vor Einwilligung gesetzt?' }, { method: 'SCANNER', mechanism: 'Repo-/Netzwerk-/Prozess-Scan', deterministic: 'ja', example: 'Geplant: technische Nachweise' }, ] function Field({ label, value, mono }: { label: string; value: string; mono?: boolean }) { return (
{label}
{value}
) } function StageRow({ stage, last, open, onToggle }: { stage: Stage; last: boolean; open: boolean; onToggle: () => void }) { return (
{!last &&
}
) } export function ArchitekturView() { const [open, setOpen] = useState('b') return (

Architektur & Datenfluss

Nachvollziehbar: woher jedes Finding stammt und wie es geprüft wird. Die Engine ist überwiegend deterministisch (Regex + Embedding); ein LLM entscheidet nur die unscharfen Fälle. Ergebnisse erscheinen pro Modul progressiv und werden am Ende per Cross-Finding-Abgleich bereinigt.

Datenfluss (Überblick)

{STAGES.map((s) => (
{s.title}
))}

Links→rechts reproduzierbar. Embedding ist semantisch UND deterministisch (feste Funktion: gleicher Text → gleicher Vektor). Das LLM läuft nur für unscharfe Fälle und eskaliert mit Selbstkonfidenz.

Pipeline (Schritt für Schritt)

{STAGES.map((s, i) => ( setOpen(open === s.id ? null : s.id)} /> ))}

Modul-Engines (live)

{MODULES.map((m) => (
{m.name} live

{m.mechanism}

))}

Prüfer-Matrix (Meta-Modell)

Jede Pflicht wird einem Prüfertyp zugeordnet — so braucht es nicht pro Control eigene Logik, sondern wenige wiederverwendbare Prüfer.

{PRUEFER.map((p) => ( ))}
Prüfer Mechanismus Deterministisch Beispiel
{p.method} {p.mechanism} {p.deterministic} {p.example}
) }