feat: Add actionable hints to all 138 compliance checks
Build + Deploy / build-admin-compliance (push) Successful in 1m40s
Build + Deploy / build-backend-compliance (push) Successful in 7s
Build + Deploy / build-ai-sdk (push) Successful in 35s
Build + Deploy / build-developer-portal (push) Successful in 8s
Build + Deploy / build-tts (push) Successful in 7s
Build + Deploy / build-document-crawler (push) Successful in 8s
Build + Deploy / build-dsms-gateway (push) Successful in 7s
Build + Deploy / build-dsms-node (push) Successful in 8s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / loc-budget (push) Failing after 16s
CI / secret-scan (push) Has been skipped
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m50s
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / test-go (push) Failing after 40s
CI / test-python-backend (push) Successful in 37s
CI / test-python-document-crawler (push) Successful in 25s
CI / test-python-dsms-gateway (push) Successful in 23s
CI / validate-canonical-controls (push) Successful in 15s
Build + Deploy / trigger-orca (push) Successful in 2m28s

Each check now has a "hint" field explaining what is missing and
what the customer should do to fix it. Hints are shown in the
frontend below failed checks in red text.

Examples:
- "Bei Verarbeitung auf Basis von Art. 6(1)(f) muss dokumentiert
  werden, warum Ihr berechtigtes Interesse die Rechte der
  Betroffenen ueberwiegt."
- "Die ladungsfaehige Anschrift fehlt. Erforderlich: Strasse,
  Hausnummer, PLZ und Ort."

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-07 14:05:01 +02:00
parent 912684644e
commit 293c58d0dd
10 changed files with 151 additions and 0 deletions
@@ -19,6 +19,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"(?:betreiber|netzwerk).*verantwortlich",
],
"severity": "HIGH",
"hint": "Es fehlt der Hinweis auf die gemeinsame Verantwortlichkeit nach Art. 26 DSGVO. Benennen Sie ausdruecklich, dass Sie und die jeweilige Plattform gemeinsam Verantwortliche fuer die Datenverarbeitung sind.",
},
{
"id": "facebook_meta_named",
@@ -29,6 +30,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"meta\s+platforms.*(?:verantwortlich|controller|betreiber)",
],
"severity": "MEDIUM",
"hint": "Facebook/Meta ist nicht namentlich als gemeinsam Verantwortlicher aufgefuehrt. Nennen Sie die vollstaendige Firmenbezeichnung (z.B. Meta Platforms Ireland Limited) als Mitverantwortlichen.",
},
# ── L1: Vereinbarung Art. 26 ──────────────────────────────────────
@@ -43,6 +45,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"addendum|nachtrag|seiten.*insights",
],
"severity": "HIGH",
"hint": "Es fehlt ein Verweis auf die Vereinbarung nach Art. 26 DSGVO zwischen Ihnen und der Plattform. Erwaehnen Sie die bestehende Vereinbarung (z.B. Page Controller Addendum bei Facebook) und deren wesentlichen Inhalt.",
},
{
"id": "insights_referenced",
@@ -54,6 +57,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"(?:statistik|nutzungsstatistik).*(?:facebook|meta|fanpage|seite)",
],
"severity": "MEDIUM",
"hint": "Die Verarbeitung von Seiten-Insights bzw. Page Insights wird nicht erwaehnt. Erlaeutern Sie, dass bei Nutzung Ihrer Social-Media-Seite Insights-Daten erhoben und verarbeitet werden.",
},
{
"id": "page_controller_addendum",
@@ -65,6 +69,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"(?:addendum|nachtrag|erg(?:ae|ä)nzung).*(?:controller|verantwortlich)",
],
"severity": "LOW",
"hint": "Das Page Controller Addendum (bzw. die Seiten-Insights-Ergaenzung) wird nicht namentlich erwaehnt. Verweisen Sie konkret auf das Addendum und verlinken Sie es, damit Betroffene die Vereinbarung nachvollziehen koennen.",
},
# ── L1: Anlaufstelle ──────────────────────────────────────────────
@@ -80,6 +85,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"wenden\s+sie\s+sich",
],
"severity": "MEDIUM",
"hint": "Es fehlt eine Anlaufstelle fuer Betroffene gemaess Art. 26(1) S.3 DSGVO. Geben Sie an, an wen sich Betroffene zur Wahrnehmung ihrer Rechte wenden koennen.",
},
{
"id": "contact_both_parties",
@@ -91,6 +97,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"(?:facebook|meta|google|plattform).*(?:als\s+auch|oder|und).*(?:uns|bei\s+uns)",
],
"severity": "LOW",
"hint": "Die Kontaktdaten beider Verantwortlicher sind nicht vollstaendig angegeben. Stellen Sie klar, dass Betroffene ihre Rechte sowohl bei Ihnen als auch bei der Plattform geltend machen koennen, und nennen Sie die jeweiligen Kontaktwege.",
},
# ── L1: Verarbeitungsaufteilung ───────────────────────────────────
@@ -105,6 +112,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"(?:nutzungsstatistik|statistik|insight).*(?:betreiber|netzwerk)",
],
"severity": "HIGH",
"hint": "Es fehlt eine Beschreibung, welche Datenverarbeitungen Sie und welche die Plattform vornimmt. Erlaeutern Sie die Aufgabenverteilung (z.B. wer Insights-Daten erhebt und wer sie auswertet).",
},
# ── L1: Datenkategorien ───────────────────────────────────────────
@@ -119,6 +127,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"(?:nutzername|beitr(?:ae|ä)g|profil|like|kommentar)",
],
"severity": "HIGH",
"hint": "Die Kategorien der verarbeiteten Daten sind nicht aufgefuehrt. Listen Sie auf, welche Daten verarbeitet werden (z.B. IP-Adresse, Standort, Geraetedaten, Interaktionen, demografische Daten).",
},
# ── L1: Plattformen ───────────────────────────────────────────────
@@ -132,6 +141,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"social\s*media.*(?:angebot|pr(?:ae|ä)senz|auftritte)",
],
"severity": "MEDIUM",
"hint": "Die genutzten Social-Media-Plattformen werden nicht aufgelistet. Fuehren Sie alle Plattformen namentlich auf, auf denen Sie Praesenzen betreiben (z.B. Facebook, Instagram, LinkedIn, YouTube).",
},
{
"id": "platform_dse_links",
@@ -143,6 +153,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"(?:privacy\s+policy|datenschutzerkl(?:ae|ä)rung).*(?:finden\s+sie|abrufbar|unter)",
],
"severity": "LOW",
"hint": "Es fehlen Links zu den Datenschutzerklaerungen der einzelnen Plattformen. Verlinken Sie die jeweilige Privacy Policy (z.B. von Meta, Google, LinkedIn), damit Nutzer sich dort informieren koennen.",
},
# ── L1: Drittlandtransfer ─────────────────────────────────────────
@@ -157,6 +168,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"(?:(?:ue|ü)bermittlung|(?:ueber|über)mittlung).*(?:usa|drittland|au(?:ss|ß)erhalb)",
],
"severity": "MEDIUM",
"hint": "Es fehlt ein Hinweis auf den Drittlandtransfer in die USA. Informieren Sie darueber, dass Daten in die USA uebermittelt werden, und nennen Sie die Rechtsgrundlage dafuer (z.B. Angemessenheitsbeschluss, Standardvertragsklauseln).",
},
{
"id": "usa_transfer_scc",
@@ -167,6 +179,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"standard\s+contractual\s+clause",
],
"severity": "MEDIUM",
"hint": "Standardvertragsklauseln (SCC) als Garantie fuer den US-Datentransfer werden nicht erwaehnt. Falls SCC als Rechtsgrundlage genutzt werden, fuehren Sie diese ausdruecklich auf.",
},
{
"id": "usa_transfer_dpf",
@@ -178,6 +191,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"adequacy\s+decision",
],
"severity": "LOW",
"hint": "Das EU-US Data Privacy Framework (DPF) wird nicht als Transfergrundlage erwaehnt. Falls sich die Plattform auf den Angemessenheitsbeschluss stuetzt, erwaehnen Sie dies und verweisen Sie auf die DPF-Zertifizierung.",
},
# ── L1: Rechtsgrundlage ───────────────────────────────────────────
@@ -191,6 +205,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"einwilligung.*art\.\s*6", r"lit\.\s*[a-f]",
],
"severity": "MEDIUM",
"hint": "Die Rechtsgrundlage fuer die Datenverarbeitung nach Art. 6 DSGVO fehlt. Nennen Sie die einschlaegige Rechtsgrundlage (z.B. berechtigtes Interesse nach Art. 6(1) lit. f oder Einwilligung nach Art. 6(1) lit. a).",
},
{
"id": "legal_basis_specific_lit",
@@ -200,6 +215,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"art\.\s*6\s*(?:abs\.\s*)?1\s*(?:s\.\s*1\s*)?(?:lit\.\s*)?[a-f]",
],
"severity": "LOW",
"hint": "Der konkrete Buchstabe in Art. 6(1) DSGVO ist nicht angegeben. Nennen Sie den spezifischen Erlaubnistatbestand (z.B. lit. a fuer Einwilligung oder lit. f fuer berechtigtes Interesse).",
},
# ── L1: Betroffenenrechte ─────────────────────────────────────────
@@ -214,6 +230,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"widerspruchsrecht",
],
"severity": "MEDIUM",
"hint": "Die Betroffenenrechte nach Art. 15-21 DSGVO sind nicht aufgefuehrt. Listen Sie die Rechte auf (Auskunft, Berichtigung, Loeschung, Einschraenkung, Datenuebertragbarkeit, Widerspruch) und erklaeren Sie, wie Betroffene diese ausueben koennen.",
},
{
"id": "opt_out_social",
@@ -225,6 +242,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"(?:abmelden|abschalten).*(?:tracking|statistik|insight)",
],
"severity": "LOW",
"hint": "Eine konkrete Opt-Out-Moeglichkeit fuer das Social-Media-Tracking fehlt. Beschreiben Sie, wie Nutzer dem Tracking widersprechen oder es deaktivieren koennen (z.B. ueber Plattform-Einstellungen oder Cookie-Opt-Out).",
},
# ── L1: Social Bookmarks vs Plugins ───────────────────────────────
@@ -238,6 +256,7 @@ JOINT_CONTROLLER_CHECKLIST = [
r"(?:link|verweis|weiterleitung).*(?:dienst|anbieter|netzwerk)",
],
"severity": "MEDIUM",
"hint": "Es fehlt ein Hinweis, ob Social-Media-Plugins oder nur einfache Links (Bookmarks) eingebunden sind. Stellen Sie klar, ob beim Seitenaufruf bereits Daten an die Plattformen uebertragen werden oder erst nach Klick.",
},
{
"id": "two_click_solution",
@@ -249,5 +268,6 @@ JOINT_CONTROLLER_CHECKLIST = [
r"(?:erst|nur)\s+(?:bei|nach|durch)\s+(?:klick|aktivierung).*(?:daten|verbindung)",
],
"severity": "LOW",
"hint": "Die verwendete technische Loesung (z.B. 2-Klick-Loesung oder Shariff) wird nicht beschrieben. Erlaeutern Sie, welche datenschutzfreundliche Technik eingesetzt wird, um den sofortigen Datentransfer an Plattformen zu verhindern.",
},
]