docs: Master Controls spec for document checker — 80-100 specific check criteria
Detailed requirements for the pipeline session: - Binary yes/no check_question per control - Concrete pass_criteria + fail_criteria (not 'check completeness') - correction_template from our Template Generator - 8 document types: DSI, Cookie, Impressum, Widerruf, AGB, DSFA, AVV, Loeschkonzept - ~80-100 total controls (not 25K generic ones) - Examples for DSI, Cookie, Impressum with exact field expectations Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,191 @@
|
|||||||
|
# Anforderung: Master Controls fuer Dokumentenpruefung
|
||||||
|
|
||||||
|
## Kontext
|
||||||
|
|
||||||
|
Der Compliance Agent prueft rechtliche Dokumente (DSI, AGB, Impressum, Cookie-Richtlinie,
|
||||||
|
Widerrufsbelehrung) gegen Pflichtangaben. Aktuell nutzen wir Regex-Patterns fuer die
|
||||||
|
Grundpruefung (9 Art. 13 DSGVO Felder) — das funktioniert gut fuer "ist X erwaehnt?".
|
||||||
|
|
||||||
|
Der naechste Schritt ist: **Nicht nur pruefen OB etwas erwaehnt wird, sondern ob es
|
||||||
|
KORREKT und VOLLSTAENDIG ist.** Dafuer brauchen wir Master Controls als Pruefkriterien.
|
||||||
|
|
||||||
|
## Das Problem mit den aktuellen Controls
|
||||||
|
|
||||||
|
Die 294K Atomic Controls in `canonical_controls` sind zu allgemein:
|
||||||
|
|
||||||
|
```
|
||||||
|
Titel: "Informationspflicht des Verantwortlichen gegenueber betroffenen Personen"
|
||||||
|
test_procedure: [
|
||||||
|
"Ueberpruefung der Datenschutzerklaerung auf Vollstaendigkeit",
|
||||||
|
"Pruefung ob Name und Kontaktdaten des Verantwortlichen angegeben sind",
|
||||||
|
"Verifizierung ob Kontaktdaten des DSB vorhanden sind",
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
Wenn wir das LLM fragen "Erfuellt der IHK-Text diesen Control?", sagt es "Nein"
|
||||||
|
weil der Control zu vage ist — "Vollstaendigkeit" ist subjektiv.
|
||||||
|
|
||||||
|
## Was wir brauchen
|
||||||
|
|
||||||
|
Master Controls mit **konkreten, binaerenr Pruefkriterien** pro Dokumenttyp.
|
||||||
|
Jeder Control muss eine **JA/NEIN Frage** sein die das LLM eindeutig beantworten kann.
|
||||||
|
|
||||||
|
### Beispiel: DSI (Datenschutzinformation nach Art. 13 DSGVO)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
master_control:
|
||||||
|
id: "MC-DSI-001"
|
||||||
|
title: "Vollstaendige Angabe des Verantwortlichen"
|
||||||
|
doc_type: "dse"
|
||||||
|
regulation: "DSGVO Art. 13(1)(a)"
|
||||||
|
|
||||||
|
check_question: >
|
||||||
|
Ist der Verantwortliche mit vollstaendigem Namen, Rechtsform,
|
||||||
|
Anschrift (Strasse, PLZ, Ort), E-Mail-Adresse UND Telefonnummer
|
||||||
|
angegeben?
|
||||||
|
|
||||||
|
pass_criteria:
|
||||||
|
- "Name des Verantwortlichen mit Rechtsform (z.B. GmbH, e.V., AG)"
|
||||||
|
- "Vollstaendige Postanschrift (Strasse + Hausnummer + PLZ + Ort)"
|
||||||
|
- "E-Mail-Adresse"
|
||||||
|
- "Telefonnummer"
|
||||||
|
|
||||||
|
fail_criteria:
|
||||||
|
- "Nur Firmenname ohne Anschrift"
|
||||||
|
- "Nur 'Kontaktieren Sie uns' ohne konkrete Daten"
|
||||||
|
- "Postfach statt Strasse (bei Pflicht zur ladungsfaehigen Anschrift)"
|
||||||
|
|
||||||
|
correction_template: >
|
||||||
|
Verantwortlicher im Sinne der DSGVO:
|
||||||
|
{{COMPANY_NAME}}
|
||||||
|
{{STREET}} {{HOUSE_NUMBER}}
|
||||||
|
{{ZIP}} {{CITY}}
|
||||||
|
E-Mail: {{EMAIL}}
|
||||||
|
Telefon: {{PHONE}}
|
||||||
|
Vertretungsberechtigte: {{REPRESENTATIVES}}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Beispiel: Cookie-Richtlinie (§25 TDDDG)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
master_control:
|
||||||
|
id: "MC-COOKIE-003"
|
||||||
|
title: "Zweckbeschreibung pro Cookie-Kategorie"
|
||||||
|
doc_type: "cookie"
|
||||||
|
regulation: "TDDDG §25"
|
||||||
|
|
||||||
|
check_question: >
|
||||||
|
Wird fuer JEDE Cookie-Kategorie (notwendig, funktional, statistik,
|
||||||
|
marketing) ein konkreter Zweck beschrieben — nicht nur der
|
||||||
|
Kategoriename sondern WAS damit gemacht wird?
|
||||||
|
|
||||||
|
pass_criteria:
|
||||||
|
- "Pro Kategorie mindestens ein Satz der den Zweck beschreibt"
|
||||||
|
- "'Statistik-Cookies helfen uns zu verstehen wie Besucher die Seite nutzen'"
|
||||||
|
- "'Marketing-Cookies werden fuer personalisierte Werbung verwendet'"
|
||||||
|
|
||||||
|
fail_criteria:
|
||||||
|
- "Nur Kategorienamen ohne Erklaerung"
|
||||||
|
- "'Wir verwenden Cookies' ohne Differenzierung"
|
||||||
|
- "Zweck nur als 'notwendig fuer den Betrieb' ohne Spezifikation"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Beispiel: Impressum (§5 TMG)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
master_control:
|
||||||
|
id: "MC-IMP-002"
|
||||||
|
title: "Handelsregister und USt-IdNr"
|
||||||
|
doc_type: "impressum"
|
||||||
|
regulation: "TMG §5(1) Nr. 4-6"
|
||||||
|
|
||||||
|
check_question: >
|
||||||
|
Sind Handelsregister (Registergericht + HRB/HRA-Nummer) UND
|
||||||
|
Umsatzsteuer-Identifikationsnummer angegeben (falls vorhanden)?
|
||||||
|
|
||||||
|
pass_criteria:
|
||||||
|
- "Registergericht benannt (z.B. 'Amtsgericht Konstanz')"
|
||||||
|
- "Registernummer (z.B. 'HRB 12345')"
|
||||||
|
- "USt-IdNr. im Format DE + 9 Ziffern"
|
||||||
|
|
||||||
|
fail_criteria:
|
||||||
|
- "Nur 'im Handelsregister eingetragen' ohne Details"
|
||||||
|
- "USt-IdNr. fehlt bei offensichtlichem Gewerbebetrieb"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Gewuenschte Dokumenttypen + Anzahl Controls
|
||||||
|
|
||||||
|
| Dokumenttyp | Regulation | Geschaetzte Anzahl Controls |
|
||||||
|
|-------------|-----------|---------------------------|
|
||||||
|
| DSI (Datenschutzinformation) | DSGVO Art. 13, Art. 14 | 15-20 |
|
||||||
|
| Cookie-Richtlinie | TDDDG §25, ePrivacy Art. 5(3) | 8-12 |
|
||||||
|
| Impressum | TMG §5, MStV §18 | 8-10 |
|
||||||
|
| Widerrufsbelehrung | BGB §355, §312g | 6-8 |
|
||||||
|
| AGB | BGB §305, §307, §309 | 10-15 |
|
||||||
|
| DSFA | DSGVO Art. 35, Landes-Listen | 12-15 |
|
||||||
|
| AVV | DSGVO Art. 28 | 10-12 |
|
||||||
|
| Loeschkonzept | DSGVO Art. 5(1)(e), DIN 66398 | 8-10 |
|
||||||
|
|
||||||
|
**Gesamt: ca. 80-100 Master Controls** — nicht 25.000, sondern die spezifischen
|
||||||
|
Pruefkriterien fuer die Dokumentenpruefung.
|
||||||
|
|
||||||
|
## Technische Anforderungen
|
||||||
|
|
||||||
|
### Felder die der Doc-Checker braucht
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Pro Master Control:
|
||||||
|
id UUID
|
||||||
|
doc_type VARCHAR -- 'dse', 'cookie', 'impressum', 'widerruf', 'agb', 'dsfa', 'avv'
|
||||||
|
regulation VARCHAR -- 'DSGVO Art. 13(1)(a)', 'TDDDG §25'
|
||||||
|
title VARCHAR -- Kurztitel fuer die Checkliste
|
||||||
|
check_question TEXT -- Die Frage die das LLM beantwortet (JA/NEIN)
|
||||||
|
pass_criteria JSONB -- Was muss im Text stehen (konkret)
|
||||||
|
fail_criteria JSONB -- Was darf NICHT stehen / was fehlt
|
||||||
|
correction_template TEXT -- Korrekturvorschlag mit Platzhaltern
|
||||||
|
severity VARCHAR -- 'HIGH', 'MEDIUM', 'LOW'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Wie der Doc-Checker sie nutzt
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 1. Query: Alle Controls fuer doc_type='dse'
|
||||||
|
controls = db.query(MasterControl).filter(doc_type='dse').all()
|
||||||
|
|
||||||
|
# 2. Fuer jeden Control: LLM fragen
|
||||||
|
prompt = f"""
|
||||||
|
{control.check_question}
|
||||||
|
|
||||||
|
PASS wenn: {control.pass_criteria}
|
||||||
|
FAIL wenn: {control.fail_criteria}
|
||||||
|
|
||||||
|
DOKUMENTTEXT:
|
||||||
|
{document_text[:5000]}
|
||||||
|
|
||||||
|
Antworte mit JSON: {{"passed": true/false, "evidence": "textstelle", "issue": "problem"}}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 3. Bei FAIL: correction_template als Korrekturvorschlag anbieten
|
||||||
|
```
|
||||||
|
|
||||||
|
### Wo die Controls liegen sollen
|
||||||
|
|
||||||
|
Entweder:
|
||||||
|
- **Neue Tabelle** `compliance.doc_check_controls` (saubere Trennung)
|
||||||
|
- **Oder** in `canonical_controls` mit `doc_type` Feld + Flag `is_doc_check = true`
|
||||||
|
- **Oder** in `master_controls` mit `lifecycle_phase = 'document_check'`
|
||||||
|
|
||||||
|
Die einfachste Variante ist eine neue Tabelle — keine Vermischung mit den
|
||||||
|
294K bestehenden Controls.
|
||||||
|
|
||||||
|
## Zusammenfassung
|
||||||
|
|
||||||
|
Wir brauchen **~80-100 hochspezifische Pruefkriterien** die:
|
||||||
|
1. Einem konkreten Dokumenttyp zugeordnet sind
|
||||||
|
2. Eine binaere JA/NEIN Frage stellen
|
||||||
|
3. Konkrete pass_criteria haben (nicht "Vollstaendigkeit pruefen")
|
||||||
|
4. Konkrete fail_criteria haben (typische Fehler)
|
||||||
|
5. Einen Korrekturvorschlag mitliefern (aus unseren Templates)
|
||||||
|
|
||||||
|
Das LLM (Qwen 3.5:35b) kann dann jede Frage zuverlaessig beantworten
|
||||||
|
weil die Frage praezise genug ist.
|
||||||
Reference in New Issue
Block a user