docs: instruction for hardcoded knowledge → Control Library migration
6 files with hardcoded legal knowledge identified. Review deadline 2026-07-01. legal_basis_validator.py marked with warning log on every use. Instruction file for other session to execute migration. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
# Instruktion: Hartkodiertes Wissen → Control Library Migration
|
||||
|
||||
**Branch:** `feat/zeroclaw-compliance-agent`
|
||||
**Repo:** `/Users/benjaminadmin/Projekte/breakpilot-compliance/`
|
||||
**Erstellt:** 2026-04-29
|
||||
**Review-Deadline:** 2026-07-01
|
||||
|
||||
## Problem
|
||||
|
||||
Der Compliance Agent hat 6 Dateien mit hartkodiertem Rechtswissen in Python-Dicts.
|
||||
Das Wissen veraltet und wird nicht von der Pipeline aktualisiert. Langfristig muss
|
||||
alles aus der Control Library kommen (166k+ Controls in `compliance.canonical_controls`).
|
||||
|
||||
## Inventar (alle im Backend: `backend-compliance/compliance/services/`)
|
||||
|
||||
| Datei | Hartkodiert | Zeilen | Prioritaet |
|
||||
|-------|------------|--------|-----------|
|
||||
| `legal_basis_validator.py` | `CORRECT_BASIS` dict — 7 Lit-Zuordnungen (Art. 6 lit. a-f pro Zweck) | ~50 LOC | HOCH |
|
||||
| `service_registry.py` | `SERVICE_REGISTRY` dict — 82 Services mit Legal Refs | ~500 LOC | MITTEL |
|
||||
| `mandatory_content_checker.py` | `MANDATORY_DSE_CONTENT` (9 Felder) + `MANDATORY_IMPRESSUM_CONTENT` (5 Felder) | ~80 LOC | MITTEL |
|
||||
| `relevance_filter.py` | `CONTROL_RELEVANCE` dict — 7 Controls mit Keyword-Listen | ~60 LOC | MITTEL |
|
||||
| `consent-tester/services/script_analyzer.py` | `SERVICE_PATTERNS` — 19 Services (Duplikat von Registry) | ~70 LOC | NIEDRIG |
|
||||
| `consent-tester/services/banner_detector.py` | `CMP_SELECTORS` — 10 CMPs | PERMANENT (technisch) | — |
|
||||
|
||||
## Migrationspfad pro Datei
|
||||
|
||||
### Schritt 1: Controls in der Pipeline generieren
|
||||
|
||||
Fuer jedes Dict-Entry einen entsprechenden Control in der Pipeline generieren lassen.
|
||||
|
||||
Beispiel fuer `legal_basis_validator.py`:
|
||||
|
||||
```sql
|
||||
-- Neuer Control in canonical_controls:
|
||||
INSERT INTO compliance.canonical_controls (title, objective, requirements, scope_conditions, tags)
|
||||
VALUES (
|
||||
'Cookie-Tracking erfordert Einwilligung (lit. a)',
|
||||
'Cookie-Tracking und Webanalyse duerfen nur mit ausdruecklicher Einwilligung (Art. 6 Abs. 1 lit. a DSGVO) erfolgen.',
|
||||
'Rechtsgrundlage fuer Cookie-Tracking muss Art. 6(1)(a) sein. Art. 6(1)(f) (berechtigtes Interesse) ist nach EuGH C-673/17 (Planet49) nicht zulaessig.',
|
||||
'{"applies_when": "cookie_tracking OR web_analytics"}',
|
||||
ARRAY['legal_basis', 'lit_mapping', 'cookie', 'planet49']
|
||||
);
|
||||
```
|
||||
|
||||
Benoetigte Controls (aus legal_basis_validator.py CORRECT_BASIS):
|
||||
1. `cookie_tracking` → lit. a (Planet49)
|
||||
2. `web_analytics` → lit. a (DSK Orientierungshilfe, §25 TDDDG)
|
||||
3. `marketing_email` → lit. a (Art. 7 DSGVO, §7 UWG)
|
||||
4. `remarketing` → lit. a (§25 TDDDG)
|
||||
5. `credit_check` → lit. b/f + Art. 22 Pflichthinweis
|
||||
6. `social_media_embed` → lit. a (Fashion ID Urteil)
|
||||
7. `session_recording` → lit. a (§25 TDDDG)
|
||||
|
||||
Benoetigte Controls (aus mandatory_content_checker.py):
|
||||
1. DSE muss Verantwortlichen nennen (Art. 13(1)(a))
|
||||
2. DSE muss DSB-Kontakt nennen (Art. 13(1)(b))
|
||||
3. DSE muss Zwecke nennen (Art. 13(1)(c))
|
||||
4. DSE muss Rechtsgrundlagen nennen (Art. 13(1)(c))
|
||||
5. DSE muss Speicherdauer nennen (Art. 13(2)(a))
|
||||
6. DSE muss Betroffenenrechte nennen (Art. 13(2)(b-d))
|
||||
7. DSE muss Beschwerderecht nennen (Art. 13(2)(d))
|
||||
8. DSE muss Drittlandtransfer nennen (Art. 13(1)(f))
|
||||
9. DSE muss automatisierte Entscheidungen nennen (Art. 13(2)(f))
|
||||
|
||||
### Schritt 2: Agent-Code aendern — Control Library first, Dict as Fallback
|
||||
|
||||
```python
|
||||
# VORHER (hartkodiert):
|
||||
CORRECT_BASIS = {"cookie_tracking": {"correct": "lit. a", ...}}
|
||||
|
||||
# NACHHER (Control Library first):
|
||||
async def get_legal_basis_rule(purpose: str) -> dict | None:
|
||||
controls = await query_controls(tags=["lit_mapping", purpose])
|
||||
if controls:
|
||||
return controls[0] # Control Library hat Vorrang
|
||||
logger.warning("No control found for %s — using hardcoded fallback", purpose)
|
||||
return CORRECT_BASIS.get(purpose) # Fallback
|
||||
```
|
||||
|
||||
### Schritt 3: Dicts entfernen
|
||||
|
||||
Wenn alle Controls in der Library sind und der Agent sie zuverlaessig findet:
|
||||
- Dicts loeschen
|
||||
- Warning-Logs entfernen
|
||||
- Tests aktualisieren
|
||||
|
||||
## Welche Datei NICHT migriert wird
|
||||
|
||||
`banner_detector.py` — die CMP-Selektoren sind technische CSS-Patterns, kein
|
||||
Rechtswissen. Die bleiben hartkodiert und werden aktualisiert wenn CMPs ihre UI aendern.
|
||||
|
||||
## Erkennungszeichen im Code
|
||||
|
||||
Alle betroffenen Dateien haben:
|
||||
- `⚠️ TECHNISCHE SCHULD` im Docstring
|
||||
- `Review-Datum: 2026-07-01` im Header
|
||||
- `logger.warning("... HARDCODED rules ...")` bei Nutzung
|
||||
|
||||
## Memory-Datei
|
||||
|
||||
Details: `/Users/benjaminadmin/.claude/projects/-Users-benjaminadmin-Projekte-breakpilot-lehrer/memory/hardcoded_knowledge_debt.md`
|
||||
Reference in New Issue
Block a user