140 lines
4.2 KiB
Markdown
140 lines
4.2 KiB
Markdown
|
|
# STEP 10 – Technische Einwilligungs-Protokollierung
|
|||
|
|
|
|||
|
|
## Ziel
|
|||
|
|
Jede KI-bezogene Datenverarbeitung muss technisch nachweisbar
|
|||
|
|
durch eine Einwilligung gedeckt sein.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. Datenmodell
|
|||
|
|
|
|||
|
|
Jeder Consent-Eintrag enthält:
|
|||
|
|
|
|||
|
|
| Feld | Typ | Beschreibung |
|
|||
|
|
|---|---|---|
|
|||
|
|
| user_id | string | Benutzername aus Profil |
|
|||
|
|
| consent_type | string | Immer "ai_processing" |
|
|||
|
|
| consent_version | string | Stand-Datum aus ai_consent.md |
|
|||
|
|
| timestamp | string | UTC ISO-8601 |
|
|||
|
|
| source | string | "ui", "test", "admin" |
|
|||
|
|
| action | string | "grant" oder "revoke" |
|
|||
|
|
| prev_hash | string | SHA-256 des vorherigen Eintrags |
|
|||
|
|
| hash | string | SHA-256 dieses Eintrags (Integritaetskette) |
|
|||
|
|
|
|||
|
|
## 2. Speicherort
|
|||
|
|
|
|||
|
|
- Datei: `aza_consent_log.json` (Projekt-Root)
|
|||
|
|
- Format: JSON-Array (Append-only)
|
|||
|
|
- Manipulationssicherheit: SHA-256-Hash-Kette
|
|||
|
|
(jeder Eintrag referenziert den Hash des vorherigen)
|
|||
|
|
- Kein Überschreiben: Widerruf erzeugt neuen Eintrag,
|
|||
|
|
alter Grant bleibt in der Historie
|
|||
|
|
|
|||
|
|
## 3. Enforcement-Punkte
|
|||
|
|
|
|||
|
|
KI-Funktionen werden an folgenden Stellen blockiert, wenn
|
|||
|
|
keine gueltige Einwilligung vorliegt:
|
|||
|
|
|
|||
|
|
| Stelle | Datei | Methode |
|
|||
|
|
|---|---|---|
|
|||
|
|
| Chat Completion (alle KI-Texte) | basis14.py | call_chat_completion() |
|
|||
|
|
| Transkription | basis14.py | transcribe_wav() |
|
|||
|
|
| Aufnahme starten | basis14.py | toggle_record() |
|
|||
|
|
| Korrektur-Aufnahme | basis14.py | _toggle_record_append() |
|
|||
|
|
| Diktat in Widget | basis14.py | _diktat_into_widget() |
|
|||
|
|
| KI-Prüfung | basis14.py | open_ki_pruefen() |
|
|||
|
|
| Interaktionscheck | basis14.py | do_interaktion() |
|
|||
|
|
|
|||
|
|
Bei fehlendem Consent:
|
|||
|
|
- UI-Einstiegspunkte: Consent-Dialog wird angezeigt
|
|||
|
|
- API-Gateways: RuntimeError wird geworfen
|
|||
|
|
|
|||
|
|
## 4. UI-Elemente
|
|||
|
|
|
|||
|
|
### 4.1 Consent-Dialog (vor erster KI-Nutzung)
|
|||
|
|
- Zeigt den kompletten Text aus legal/ai_consent.md
|
|||
|
|
- Checkbox: "Ich habe den Text gelesen und stimme zu"
|
|||
|
|
- Buttons: "Zustimmen" / "Ablehnen"
|
|||
|
|
- Wird nur angezeigt, wenn kein gueltiger Consent vorliegt
|
|||
|
|
|
|||
|
|
### 4.2 Einstellungsfenster (Datenschutz & Recht)
|
|||
|
|
- Status-Anzeige: "Erteilt" / "Nicht erteilt / widerrufen"
|
|||
|
|
- Button: "KI-Einwilligung widerrufen" / "erteilen"
|
|||
|
|
- Button: "Consent-Log exportieren"
|
|||
|
|
- Bestehende Buttons: Datenschutzerklaerung, KI-Einwilligung
|
|||
|
|
|
|||
|
|
## 5. Versions-Handling
|
|||
|
|
|
|||
|
|
- Die Consent-Version wird aus dem "Stand:"-Feld in
|
|||
|
|
legal/ai_consent.md extrahiert
|
|||
|
|
- Bei Aenderung des Consent-Textes (neues Datum) wird
|
|||
|
|
ein bestehender Consent ungueltig
|
|||
|
|
- Benutzer muss erneut zustimmen
|
|||
|
|
|
|||
|
|
## 6. Audit-Workflow
|
|||
|
|
|
|||
|
|
### Export
|
|||
|
|
```
|
|||
|
|
python -c "from aza_consent import export_consent_log; print(export_consent_log())"
|
|||
|
|
```
|
|||
|
|
Oder ueber Einstellungen -> "Consent-Log exportieren"
|
|||
|
|
|
|||
|
|
### Integritaetspruefung
|
|||
|
|
```
|
|||
|
|
python -c "from aza_consent import verify_chain_integrity; ok, e = verify_chain_integrity(); print('OK' if ok else e)"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Export-Format
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"export_timestamp": "2026-02-22T...",
|
|||
|
|
"total_entries": 3,
|
|||
|
|
"current_consent_version": "Februar 2026",
|
|||
|
|
"entries": [
|
|||
|
|
{
|
|||
|
|
"user_id": "...",
|
|||
|
|
"consent_type": "ai_processing",
|
|||
|
|
"consent_version": "Februar 2026",
|
|||
|
|
"timestamp": "2026-02-22T...",
|
|||
|
|
"source": "ui",
|
|||
|
|
"action": "grant",
|
|||
|
|
"prev_hash": "0000...0000",
|
|||
|
|
"hash": "a1b2c3..."
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 7. Geaenderte / Neue Dateien
|
|||
|
|
|
|||
|
|
| Datei | Aktion |
|
|||
|
|
|---|---|
|
|||
|
|
| aza_consent.py | NEU – Consent-Modul (Datenmodell, Storage, Enforcement, Export) |
|
|||
|
|
| basis14.py | GEAENDERT – Import aza_consent, Consent-Check an 7 Stellen |
|
|||
|
|
| aza_settings_mixin.py | GEAENDERT – Widerruf/Erteil-Button, Status, Export im Einstellungsfenster |
|
|||
|
|
| _test_consent.py | NEU – Testskript (14 Tests) |
|
|||
|
|
|
|||
|
|
## 8. Test-Ergebnisse (22.02.2026)
|
|||
|
|
|
|||
|
|
| Test | Ergebnis |
|
|||
|
|
|---|---|
|
|||
|
|
| Ohne Consent -> KI blockiert | PASS |
|
|||
|
|
| Consent erteilen -> KI erlaubt | PASS |
|
|||
|
|
| Widerruf -> KI blockiert | PASS |
|
|||
|
|
| Erneuter Consent -> KI erlaubt | PASS |
|
|||
|
|
| Hash-Kette intakt | PASS |
|
|||
|
|
| Status-Abfrage korrekt | PASS |
|
|||
|
|
| Version-Match | PASS |
|
|||
|
|
| Export erstellt gueltige Datei | PASS |
|
|||
|
|
| User-Historie korrekt | PASS |
|
|||
|
|
| Anderer User -> kein Consent | PASS |
|
|||
|
|
| Gesamt: 14/14 | ALLE BESTANDEN |
|
|||
|
|
|
|||
|
|
## 9. Risiken
|
|||
|
|
|
|||
|
|
| Risiko | Bewertung | Massnahme |
|
|||
|
|
|---|---|---|
|
|||
|
|
| JSON-Datei manuell editierbar | NIEDRIG | Hash-Kette erkennt Manipulation |
|
|||
|
|
| Kein digitaler Signatur-Mechanismus | MITTEL | Fuer Audit: Export + Integritaetspruefung |
|
|||
|
|
| Consent nur auf App-Ebene, nicht Patient | NIEDRIG | Papier-Einwilligung ergaenzt dies |
|