Shooting Data Consent Go-Live Runbook¶
Dieses Runbook beschreibt den betrieblichen Wechsel fuer die Schiessdaten-Freigabe in der Hauptapp. Es deckt Backfill, Go-Live-Verifikation und den Support-Pfad fuer blockierte Nutzer ab.
Wichtig:
- Die Consent-Logik blockiert Anzeige und verwaltete Sichten, nicht den technischen Ingest.
- Altbestand darf nicht implizit freigeschaltet werden.
- Minderjaehrige unter
16duerfen nicht per Self-Consent freigeschaltet werden.
Ziel des Backfills¶
Fuer bestehende Nutzer mit sportpassId legen wir einen expliziten Consent-Record an, wenn noch keiner existiert.
Sichere Default-Regeln:
- Erwachsene oder noch nicht sauber klassifizierte Nutzer:
status = PENDINGsubjectType = UNKNOWNblockedReason = backfill_missing_consent- verifiziert bekannte Minderjaehrige:
status = PARENTAL_CONSENT_REQUIREDsubjectType = MINORblockedReason = backfill_parental_consent_required
Damit bleibt der Bestand fail-closed, bis Nutzer selbst zustimmen oder eine verifizierte Elternfreigabe vorliegt.
Offener Freigabepunkt vor Produktivlauf¶
Vor dem echten Go-Live muss eine verlaessliche Quelle fuer Minderjaehrigkeit festgelegt sein.
Erlaubte Varianten:
- Geburtsdatum oder Geburtsjahr aus einem verifizierten Stammdatenpfad
- eine sportjahresbezogene DSB-Altersklassenzuordnung, wenn sie fuer den jeweiligen Sportbereich belastbar abgeleitet werden kann
- eine kuratierte Override-Liste fuer den initialen Cutover
Nicht ausreichend:
- pauschale Vermutungen aus frei interpretierten Wettkampfklassen
- manuelle Einzelfallannahmen ohne dokumentierte Quelle
Bis diese Quelle final bestaetigt ist, darf der produktive Backfill nur mit einer kuratierten Minor-Override-Liste oder komplett fail-closed auf PENDING/UNKNOWN erfolgen.
Backfill-Skript¶
Das Backend bringt ein idempotentes Skript fuer den Bestand mit:
cd targetshot/backend
npm run shooting-data-consent:backfill -- --dry-run
Optionen:
--dry-run: nur Plan und Zaehler ausgeben--sync-existing: bestehendePENDING/UNKNOWN-Records fuer bekannte Minderjaehrige aufMINOR/PARENTAL_CONSENT_REQUIREDhochstufen--user-id=<id>: auf einen Benutzer eingrenzen--sportpass-id=<id>: auf eine Sportpass-ID eingrenzen--overrides-file=<path>: JSON-Datei mit bekannten Minderjaehrigen
Beispiel fuer eine Override-Datei:
{
"minorUserIds": [
"keycloak-user-id-1"
],
"minorSportpassIds": [
"41301343",
"41309999"
]
}
Dry-Run mit Override-Datei:
cd targetshot/backend
npm run shooting-data-consent:backfill -- \
--dry-run \
--overrides-file=./tmp/shooting-data-minors.json
Echter Lauf:
cd targetshot/backend
npm run shooting-data-consent:backfill -- \
--overrides-file=./tmp/shooting-data-minors.json
Spaeterer Nachlauf nach finaler Altersquellen-Freigabe:
cd targetshot/backend
npm run shooting-data-consent:backfill -- \
--sync-existing \
--overrides-file=./tmp/shooting-data-minors.json
Empfohlener Ablauf fuer Staging oder Prod¶
1. Vorab pruefen¶
- DB-Backup oder Snapshot vorhanden
- aktuelles App-Release mit Consent-Backend und Consent-Frontend ist bereits deployed
- Support weiss, dass Altbestand ab dem Cutover blockiert sein kann
- Minor-Quelle oder Override-Datei ist dokumentiert
2. Dry-Run fahren¶
Erwartung:
createCountgroesser0fuer Nutzer ohne Consent-RecordupdateCountnur dann groesser0, wenn bewusst--sync-existinggenutzt wirditemszeigen fuer bekannte MinderjaehrigePARENTAL_CONSENT_REQUIRED
3. Backfill anwenden¶
Nur ausfuehren, wenn Dry-Run plausibel ist.
4. Direkt danach verifizieren¶
- Consent-Route in der App blockiert Bestand ohne Zustimmung
- persoenliche Dashboards liefern ohne Freigabe keine sensiblen Schiessdaten
- Coach-/Club-/Jugendpfade liefern ohne Betroffenen-Freigabe keine sensiblen Daten
- verifizierte Elternfreigabe entsperrt Minderjaehrige erst nach Link plus Code
Testmatrix fuer Go-Live¶
Mindestens diese Faelle einmal Ende-zu-Ende pruefen:
Selbstsicht¶
- Erwachsener ohne Consent:
- Login erfolgreich
- App leitet auf Consent-Seite
- Dashboard/Reports blockiert
- Erwachsener mit Self-Consent:
- persoenliche Schiessdaten sichtbar
- Profil zeigt
GRANTED - Erwachsener nach Widerruf:
- persoenliche Schiessdaten sofort wieder blockiert
Minderjaehrige¶
- Minderjaehriger ohne Elternfreigabe:
- Login erfolgreich
- Consent-Seite zeigt Elternfreigabe-Pfad
- keine persoenlichen Schiessdaten sichtbar
- Minderjaehriger nach Versand der Elternmail:
- Status
PARENTAL_PENDING - Mailversand allein schaltet nichts frei
- Minderjaehriger nach verifizierter Elternfreigabe:
- Status
GRANTED - persoenliche Schiessdaten sichtbar
Verwaltete Sichten¶
- Coach mit Club-Scope und freigegebenem Betroffenen:
- Schiessdaten sichtbar
- Coach mit Club-Scope, aber ohne Freigabe des Betroffenen:
consent_requiredoderguardian_consent_required- Jugendtrainer mit Jugendscope:
- nur freigegebene Jugendschützen sichtbar
- Clubfremder Zugriff:
- immer
forbidden, unabhaengig vom Consent
Support- und Betriebsleitfaden¶
Fall: Nutzer sieht nur Consent-Seite¶
Pruefen:
- existiert
ShootingDataConsentfuer den Nutzer? - welcher
statusliegt vor? - ist
blockedReasonplausibel?
Interpretation:
PENDING: erwachsener oder noch unklassifizierter Nutzer ohne ZustimmungPARENTAL_CONSENT_REQUIRED: Minderjaehriger, Elternfreigabe noch nicht gestartetPARENTAL_PENDING: Elternfreigabe gestartet, aber noch nicht verifiziertREJECTED: Elternfreigabe explizit abgelehntREVOKED: frueher freigegeben, danach widerrufen
Fall: Coach sieht einen Schuetzen nicht¶
Pruefen:
- Rolle und Club-Scope korrekt?
- hat der Betroffene
GRANTED? - falls minderjaehrig: wurde Elternfreigabe wirklich verifiziert?
Fall: Elternfreigabe-Mail kam nicht an¶
Pruefen:
- Mailversandfehler im Backend-Log
guardian_delivery_failedoderguardian_verification_pendingim Blockgrund- Guardian-Adresse im Consent-Record korrekt
Fall: Widerruf rueckgaengig machen¶
- kein stilles Admin-Override im DB-Feld
- Betroffener muss erneut zustimmen
- fuer Minderjaehrige erneut ueber den verifizierten Elternpfad gehen
Operator-Notizen fuer den ersten Produktivlauf¶
- Den ersten Lauf mit Dry-Run-JSON archivieren.
- Nach dem Apply die Summenzaehler ebenfalls sichern.
- Minor-Override-Datei als kontrolliertes Betriebsartefakt behandeln, nicht lose per Chat weiterreichen.
- Wenn die verlaessliche Altersquelle spaeter feststeht, den Nachlauf mit
--sync-existingexplizit dokumentieren.