# Consent-Ledger-Runbook für elccon.com

elccon.com: 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=2289e2aeb65d5c3021c39fb8b054747000099bd76e472444fbf8c8f4db2a7220
- consent_saved: action=accept_or_save, row_hash=7f18a74dfc73ce140f733152fd1fcea52fa8e6934894f1ecc80886713bf35572
- consent_rejected: action=reject, row_hash=5f41b5643e30c84d11a9524400ade8656718ebfc5c6b0add065a16d652193ec8
- consent_withdrawn: action=withdraw, row_hash=6832f7c050e0737b951095465728520a432be0d1cf2ec2ed4e91aa53708254d6
- gpc_seen: action=gpc, row_hash=ce853d9b9925f0fcedf60945d3650051c51e8dab55722a7ad72fde30ef21591a
- vendor_sync: action=sync, row_hash=c7f383b67a7accd009e28a138c808db11ededaa21eadb7cb8c7d144ac8bef391
- rescan_evidence: action=rescan, row_hash=49d4f0e968f6ad4bf64377e14bb4e7e35ef0cc64627b3376bcaa786fa08ba3ab

## 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_elccon_com (
  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_elccon_com_subject_idx ON consent_ledger_elccon_com (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: 'elccon.com',
      banner_version: 'v1',
      policy_version: 'privacy-notice-current',
      action: 'save',
      categories: event.detail,
      evidence_ref: window.location.href
    })
  });
});
```

