# Consent-Ledger-Runbook für altenpflegeheim-duderstadt.de

altenpflegeheim-duderstadt.de: Consent-Ledger-Blueprint mit 14 Datenfeldern, 7 Ereignissen, 7 Log-Zeilen und 6 Kategorien für auditierbare Einwilligungsnachweise.

> Der Ledger-Blueprint ist eine technische Betreiber-Vorlage. Rechtsgrundlage, Speicherfrist, Zugriffsschutz und Integration in CMP/Backend müssen fachlich freigegeben werden.

## Ereignisse
- Banner angezeigt: Erstaufruf ohne gespeicherte Entscheidung Felder: domain, banner_version, policy_version, region, created_at
- Einwilligung gespeichert: Nutzer klickt Akzeptieren oder speichert Kategorien Felder: consent_id, categories, services, action, created_at
- Ablehnung gespeichert: Nutzer klickt Ablehnen Felder: consent_id, categories, action, created_at
- Widerruf gespeichert: Privacy-Trigger oder Preference Center ändert Entscheidung Felder: previous_consent_id, withdrawn_at, categories, source
- GPC-Signal berücksichtigt: Browser sendet Global Privacy Control Felder: gpc_signal, region, action, created_at
- Downstream-Sync: Tag Manager, Analytics, Ads, CRM oder CMP erhält Status Felder: destination, categories, sync_status, created_at
- Re-Scan-Nachweis: Nach Ihrer Änderung erneut prüfen Felder: scan_id, checked_at, result_url, evidence_hash

## Datenfelder
- consent_id (uuid/string): Eindeutiger Nachweisdatensatz Nicht als Klartext-Personenkennung verwenden.
- subject_key_hash (sha256/string): Wiedererkennung ohne Klartext-ID Salt/Rotation und Zugriffsschutz dokumentieren.
- domain (string): Betroffene Website Mandanten-/Domain-Trennung erzwingen.
- region (string): DE/EU/CH/AT oder CMP-Region Regelbasiertes Verhalten nachvollziehbar machen.
- banner_version (string): Version der Consent-Oberfläche Bei Text-/Layoutänderung erhöhen.
- policy_version (string): Datenschutz-/Cookie-Hinweis-Version Mit veröffentlichtem Hinweis und Datum verbinden.
- categories_json (json): Status je Kategorie Nur notwendige Kategorien speichern.
- services_json (json): Optionaler Status je Dienst Dienste aus Anbieterregister synchronisieren.
- action (enum): accept, reject, save, withdraw, gpc Ablehnung und Widerruf gleichwertig protokollieren.
- ip_hash (string/null): Missbrauchs-/Nachweisbezug Klartext-IP vermeiden; Speicherfrist begrenzen.
- user_agent_hash (string/null): Technischer Kontext Nicht für Tracking oder Profiling verwenden.
- evidence_ref (string): Verweis auf Scan, Screenshot oder Export Keine sensiblen Rohdaten in öffentliche Exporte schreiben.
- created_at (datetime): Zeitpunkt der Entscheidung Zeitzone und Serverzeit stabil halten.
- expires_at (datetime/null): Review-/Ablauffrist Regelmäßige Erneuerung und Löschung planen.

## Transaktionslog
- banner_shown: action=show, row_hash=ecbafa16229eb9fc6ccf557d410b94ec09bf4e937e57e188d70a7cd209d1f76a
- consent_saved: action=accept_or_save, row_hash=dadd99dfc8ac763b15f131ae5aa03030fcd7c4838e8fc6fd8e7234323d4272a5
- consent_rejected: action=reject, row_hash=adcb936b0657f14dc733232dfd439fd51a5746f786635c41f80c3b549ae53656
- consent_withdrawn: action=withdraw, row_hash=3fd9753abacd9563c37a777991215d14b6247311c28627626614d78a6adfef3c
- gpc_seen: action=gpc, row_hash=af94f13da0f5bc2a5c95b35ed54d9cf928b9741a523c2c0a315e29013596ecec
- vendor_sync: action=sync, row_hash=d919af33a8dc1df777199849938090057c3fee239e2f98b453e4e7f1fbe701f2
- rescan_evidence: action=rescan, row_hash=809b1804b135ed48ae0961194c3f75d5c2e9d07501bedddea186c41de3349e5a

## Log-Export-Kontrollen
- **Domain und Zeitraum**: Export immer nach Domain, Zeitraum und Rechtsraum filtern; keine domainübergreifenden Rohlogs ohne Zweckfreigabe.
- **Pseudonymisierung**: Subject-, IP- und User-Agent-Bezug nur gehasht und mit Zugriffsschutz exportieren.
- **Hashkette**: Jede Zeile enthält previous_hash und row_hash, damit nachträgliche Änderungen auffallen.
- **Betroffenenrechte**: DSAR-Export trennt Nachweiszweck, technische Logs und Lösch-/Sperrentscheidungen.
- **Aufbewahrung**: Nachweisfrist und Löschfristen je Zweck dokumentieren; abgelaufene Rohdaten aggregieren oder löschen.

## Snippets
### SQL Ledger Tabelle

```
CREATE TABLE consent_ledger_altenpflegeheim_duderstadt_de (
  consent_id text PRIMARY KEY,
  subject_key_hash text NOT NULL,
  domain text NOT NULL,
  region text NOT NULL,
  banner_version text NOT NULL,
  policy_version text NOT NULL,
  action text NOT NULL CHECK (action IN ('accept','reject','save','withdraw','gpc')),
  categories_json jsonb NOT NULL,
  services_json jsonb NOT NULL DEFAULT '{}'::jsonb,
  gpc_signal boolean NOT NULL DEFAULT false,
  ip_hash text,
  user_agent_hash text,
  evidence_ref text,
  created_at timestamptz NOT NULL DEFAULT now(),
  expires_at timestamptz
);
CREATE INDEX consent_ledger_altenpflegeheim_duderstadt_de_subject_idx ON consent_ledger_altenpflegeheim_duderstadt_de (subject_key_hash, created_at DESC);
```

### Browser Event Bridge

```
window.addEventListener('saferpage-consent-update', function (event) {
  fetch('/privacy/consent-ledger', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    credentials: 'same-origin',
    body: JSON.stringify({
      domain: 'altenpflegeheim-duderstadt.de',
      banner_version: 'v1',
      policy_version: 'privacy-notice-current',
      action: 'save',
      categories: event.detail,
      evidence_ref: window.location.href
    })
  });
});
```

