76be96556d
DSEAgent wrappt die existierende ART13_CHECKLIST (33 kuratierte Pflichtangaben
L1 + Detailchecks L2) → strukturierter AgentOutput, NICHT der 90k-Library-
Firehose (eCall/Gesundheit/Telekom-Lärm). GET /snapshots/{id}/dse-check spiegelt
impressum-check; doc_input_from_snapshot generalisiert. Frontend: generischer
AgentModuleTab (lazy → AgentResultTab) für Impressum + DSE; DSE-Tab in der
Snapshot-Seite. Plus HRB-Pattern \d→\d+ (volle Registernummer als Beleg).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
"""DSEAgent — kuratierte Art-13/14-Checkliste (kein Library-Firehose)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import asyncio
|
|
|
|
from compliance.services.specialist_agents import REGISTRY, AgentInput
|
|
|
|
|
|
def _run(text: str):
|
|
return asyncio.run(
|
|
REGISTRY.get("dse").evaluate(AgentInput(doc_type="dse", text=text)))
|
|
|
|
|
|
def test_dse_agent_registered():
|
|
assert REGISTRY.get("dse") is not None
|
|
|
|
|
|
def test_dse_detects_core_obligations():
|
|
text = (
|
|
"Datenschutzerklaerung. Verantwortlich im Sinne der DSGVO ist die "
|
|
"Muster GmbH, Musterstrasse 1, 12345 Berlin. E-Mail: info@muster.de. "
|
|
"Datenschutzbeauftragter: dsb@muster.de. Zwecke der Verarbeitung und "
|
|
"Rechtsgrundlage Art. 6 Abs. 1. Empfaenger Ihrer Daten. Speicherdauer "
|
|
"der Daten. Ihre Rechte: Auskunft, Loeschung, Widerspruch, Beschwerde "
|
|
"bei der Aufsichtsbehoerde. ") * 3
|
|
out = _run(text)
|
|
assert out.agent == "dse"
|
|
assert out.mc_total == 33 # ART13_CHECKLIST komplett
|
|
ok = [c.label for c in out.mc_coverage if c.status == "ok"]
|
|
assert any("Verantwortlich" in lbl for lbl in ok)
|
|
assert any("Rechtsgrundlage" in lbl for lbl in ok)
|
|
|
|
|
|
def test_dse_missing_obligations_are_findings():
|
|
out = _run("Lorem ipsum dolor sit amet consectetur adipiscing elit. " * 6)
|
|
assert out.findings
|
|
assert any(f.severity == "HIGH" for f in out.findings)
|
|
|
|
|
|
def test_dse_short_text_skips():
|
|
out = _run("zu kurz")
|
|
assert out.confidence == 0.0
|
|
assert all(c.status == "skipped" for c in out.mc_coverage)
|