# SaferPage Delivery Credential Preflight

Delivery-Credential-Preflight: 1 von 7 Zielsystemtypen voll konfiguriert, 0 teilweise, native Runner-Ziele 1, Versandfreigabe nicht aktiv.

> Dieser Preflight zeigt nur Credential-Referenzen, Gate-Status und Betriebsnachweise. Er veroeffentlicht keine Webhook-URLs, API-Keys, Tokens, E-Mail-Empfaenger, Slack-/Teams-Ziel-URLs oder privaten Rohpayloads.

## Alert-Delivery-Readiness-Smoke
- Status: passed
- Ziele: 6
- Failed Checks: 0
- Erwartete Blocker: 1
- Dry-run gesendet: 0
- Runner gesendet: 0
- Evidence: https://saferpage.de/evidence/alert-delivery-readiness-smoke.json

## Zielsysteme
- Lokaler Audit-File-Sink: ready_for_approval, komplett
- Generischer Webhook: missing_configuration, fehlt: SAFERPAGE_WEBHOOK_URL, SAFERPAGE_WEBHOOK_SECRET
- Slack: missing_configuration, fehlt: SAFERPAGE_SLACK_WEBHOOK_URL
- Microsoft Teams: missing_configuration, fehlt: SAFERPAGE_TEAMS_WEBHOOK_URL
- Jira: missing_configuration, fehlt: SAFERPAGE_JIRA_BASE_URL, SAFERPAGE_JIRA_EMAIL, SAFERPAGE_JIRA_API_TOKEN
- E-Mail/SMTP: missing_configuration, fehlt: SAFERPAGE_MAIL_FROM, SAFERPAGE_MAIL_TO
- SendGrid: missing_configuration, fehlt: SENDGRID_API_KEY, SAFERPAGE_MAIL_FROM, SAFERPAGE_MAIL_TO

## Readiness-Gates
- Produktive Alert-Zustellung freigegeben: blocked - SAFERPAGE_ALERT_DISPATCH_APPROVED ist nicht aktiv; Runner bleibt Dry-run/Outbox.
- Mindestens ein nativ sendbares Zielsystem konfiguriert: passed - 1 native(s) Zielsystem(e) sind voll konfiguriert: Webhook, Slack oder Teams.
- HMAC-Signatur fuer Betreiber-Webhook verfuegbar: warning - Kein HMAC-Secret gesetzt; generische Webhooks koennen nicht signiert werden.
- Alert-Dispatch-Runner-State erreichbar: passed - State alert_dispatch_runner_state.json ist lesbar; sent=0, deliverable=16, errors=0.
- Dry-run/Outbox als Testnachweis vorhanden: passed - 64 Outbox-Eintraege im letzten Runner-State.
- No-Secret-Export: passed - Dieser Preflight zeigt nur Env-Referenzen und present/missing-Status, keine Werte, Ziel-URLs, Empfaenger, Tokens oder API-Keys.
- Runtime-Control-Manifest vorhanden: passed - 8 Delivery-Runtime-Kontrolle(n) im Evidence-Manifest dokumentiert.
- Idempotency- und Retry-Vertrag vorhanden: passed - Delivery-Payloads und Runner-State nutzen Idempotency-Key, Body-SHA-256, Status und Stop-Bedingungen.
- Zielsystem-Matrix abgedeckt: passed - 1 ready, 0 teilweise, 7 Zielsystemtypen im Preflight.

## Run-Policy
- Externe Zustellung nur wenn: --execute-ready was passed, SAFERPAGE_ALERT_DISPATCH_APPROVED=yes and the channel target is configured
- External Attempts: 0
- Local File-Sink Attempts: 0
- No-Secret-Export: ja

## Credential-Referenzen
- SAFERPAGE_ALERT_DISPATCH_APPROVED: missing - Explicit approval gate for productive alert delivery.
- SAFERPAGE_WEBHOOK_URL: missing - Generic operator webhook target.
- SAFERPAGE_WEBHOOK_SECRET: missing - HMAC-SHA256 signing secret for generic webhook deliveries.
- SAFERPAGE_SLACK_WEBHOOK_URL: missing - Slack incoming webhook target.
- SAFERPAGE_TEAMS_WEBHOOK_URL: missing - Microsoft Teams incoming webhook target.
- SAFERPAGE_LOCAL_FILE_SINK_PATH: missing - Optional override for sanitized local JSONL audit sink; default path is used when absent.

## Aktivierungssequenz
- Zielsystem-Owner, Empfaenger, Kanaele und Zwecke festlegen.
- Secrets und Ziel-URLs in /etc/saferpage/alert-dispatch.env oder Secret Manager setzen.
- Ohne SAFERPAGE_ALERT_DISPATCH_APPROVED einen Dry-run ausfuehren und /alarme/dispatch-runner-json pruefen.
- HMAC-Signatur, Idempotency-Key, Body-SHA-256 und Zielsystem-Dedupe im Testempfaenger verifizieren.
- SAFERPAGE_ALERT_DISPATCH_APPROVED=yes erst nach dokumentierter Betreiberfreigabe setzen.
- Nach erstem produktiven Lauf sent_count, error_count und Zielsystem-Logs pruefen.

## Stop-Bedingungen
- sent_count groesser 0 ohne SAFERPAGE_ALERT_DISPATCH_APPROVED=yes und dokumentierte Betreiberfreigabe.
- Oeffentliche Exports enthalten Ziel-URLs, API-Keys, Tokens, E-Mail-Empfaenger, Slack-/Teams-Webhook-URLs oder private Payloads.
- Zielsystem meldet Duplikate trotz Idempotency-Key.
- error_count groesser 0 oder wiederholte HTTP-/TLS-/Rate-Limit-Fehler.
- Empfaenger oder Kanalzweck wurden ohne Datenschutz-/Security-Abnahme geaendert.

## Delivery-Approval-Paket
- Env-Datei: /etc/saferpage/alert-dispatch.env
- Template: https://saferpage.de/integrationen/delivery-approval-template.env
- Sendet selbst: nein

### Env-Referenzen
- SAFERPAGE_ALERT_DISPATCH_APPROVED: Finales Betreiber-Go-live-Gate; erst nach Dry-run, Empfaenger- und Datenschutzfreigabe auf yes setzen.
- SAFERPAGE_WEBHOOK_URL: Generisches Betreiber-Webhook-Ziel.
- SAFERPAGE_WEBHOOK_SECRET: HMAC-SHA256-Secret fuer generische Webhook-Payloads.
- SAFERPAGE_SLACK_WEBHOOK_URL: Slack Incoming Webhook fuer PrivacyOps-/Security-Alerts.
- SAFERPAGE_TEAMS_WEBHOOK_URL: Microsoft Teams Incoming Webhook fuer Betreiber-Alerts.
- SAFERPAGE_LOCAL_FILE_SINK_PATH: Optionaler lokaler Audit-Sink fuer sanitisierte Zustellnachweise.

### Smoke-Matrix
- `scripts/run-alert-dispatch-dry-run-smoke.sh`: sent_count=0, external_send_attempt_count=0, local_file_sink_attempt_count=0.
- `python3 scripts/run-alert-dispatch.py anrufer.info --base-url http://127.0.0.1 --max 1 --timeout 15 --execute-ready`: Ohne SAFERPAGE_ALERT_DISPATCH_APPROVED=yes bleibt sent_count=0.
- `curl -fsS https://saferpage.de/alarme/anrufer.info/delivery-json`: Payload enthaelt Idempotency-Key, body_sha256 und HMAC-Receiver-Vertrag ohne Ziel-URL.
- `curl -fsS https://saferpage.de/alarme/dispatch-runner-json`: Public State enthaelt nur Env-Refs, Hashes und Status; keine Secrets, Ziel-URLs oder Empfaenger.

### Abnahme
- [ ] Mindestens ein externes natives Zielsystem ist serverseitig konfiguriert oder der lokale File-Sink ist fuer Audit-Dry-run bewusst als einziges Ziel zugelassen.
- [ ] SAFERPAGE_ALERT_DISPATCH_APPROVED=yes ist erst nach dokumentierter Betreiberfreigabe gesetzt.
- [ ] Receiver prueft X-SaferPage-Idempotency-Key und optional X-SaferPage-Signature.
- [ ] Dry-run-Smoke zeigt keine externen Sendungen und keine Secret-Leaks.
- [ ] Nach erstem produktiven Lauf sind sent_count, error_count und Zielsystem-Dedupe dokumentiert.
