# Consent-Ledger-Runbook für hawoge.de

hawoge.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=0f07e14945a89e808eb7853d8e20939a7f8ba36e2927c6dc8002de40500d325d
- consent_saved: action=accept_or_save, row_hash=8f01553469a35cdb4b91741102a13346c254df13b2a4a5d9e8f6a13b6b3e3e47
- consent_rejected: action=reject, row_hash=c96331eb8fc436ab9ec39ba7c1653bce32fdf937d2bf3e6e54030a5b01430f0f
- consent_withdrawn: action=withdraw, row_hash=5c295592cbf4ee7c2bdfa8ee14cd82b9d375dfdeb22387c8a6c0325580f6710e
- gpc_seen: action=gpc, row_hash=1a6a9c3cdedecdddad39ff26554011b55e441baf9fda7aa7cd5673cc13a1b811
- vendor_sync: action=sync, row_hash=a1a9fd51ac25635b1c801ff4d0390895c0c2319199eee26f1ee7033968760909
- rescan_evidence: action=rescan, row_hash=369348b9db5262e8204f60f29229eead22f0993dfad70e0153de92f331b6bcf0

## 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_hawoge_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_hawoge_de_subject_idx ON consent_ledger_hawoge_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: 'hawoge.de',
      banner_version: 'v1',
      policy_version: 'privacy-notice-current',
      action: 'save',
      categories: event.detail,
      evidence_ref: window.location.href
    })
  });
});
```

