diff --git a/zeroclaw/INSTRUCTION-master-controls-for-doc-check.md b/zeroclaw/INSTRUCTION-master-controls-for-doc-check.md new file mode 100644 index 0000000..8e3bd87 --- /dev/null +++ b/zeroclaw/INSTRUCTION-master-controls-for-doc-check.md @@ -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.