Skip to content

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 16 duerfen 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 = PENDING
  • subjectType = UNKNOWN
  • blockedReason = backfill_missing_consent
  • verifiziert bekannte Minderjaehrige:
  • status = PARENTAL_CONSENT_REQUIRED
  • subjectType = MINOR
  • blockedReason = 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: bestehende PENDING/UNKNOWN-Records fuer bekannte Minderjaehrige auf MINOR/PARENTAL_CONSENT_REQUIRED hochstufen
  • --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:

  • createCount groesser 0 fuer Nutzer ohne Consent-Record
  • updateCount nur dann groesser 0, wenn bewusst --sync-existing genutzt wird
  • items zeigen fuer bekannte Minderjaehrige PARENTAL_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_required oder guardian_consent_required
  • Jugendtrainer mit Jugendscope:
  • nur freigegebene Jugendschützen sichtbar
  • Clubfremder Zugriff:
  • immer forbidden, unabhaengig vom Consent

Support- und Betriebsleitfaden

Pruefen:

  • existiert ShootingDataConsent fuer den Nutzer?
  • welcher status liegt vor?
  • ist blockedReason plausibel?

Interpretation:

  • PENDING: erwachsener oder noch unklassifizierter Nutzer ohne Zustimmung
  • PARENTAL_CONSENT_REQUIRED: Minderjaehriger, Elternfreigabe noch nicht gestartet
  • PARENTAL_PENDING: Elternfreigabe gestartet, aber noch nicht verifiziert
  • REJECTED: Elternfreigabe explizit abgelehnt
  • REVOKED: 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_failed oder guardian_verification_pending im 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-existing explizit dokumentieren.