# SaferPage Security-Feed-Runner

Security-Feed-Runner: 50 Domain(s) geprüft, 0 aktivierungsbereit, 0 externe Feed-Run(s), 0 Observation(s) gespeichert, 37 durch Gates blockiert, 13 ohne Reportseite, 0 technische Fehler.

> Dieser Export zeigt nur Betriebsstatus, Gate-Entscheidungen und öffentliche Reportlinks. Er veröffentlicht keine Secret-Werte, keine Rohpayloads externer Feeds und keine personenbezogenen Besucherlogs.

## Letzter Lauf
- Start: 2026-06-09T03:39:01+00:00
- Ende: 2026-06-09T03:39:02+00:00
- Execute-ready: ja
- User-Agent: SaferPageFeedRunner/0.1 (+https://saferpage.de/bot; scheduled security feed readiness and gated feed runs)

## Run-Policy
- Externe Feed-Calls nur wenn: activation_ready=true and --execute-ready was passed
- External Attempts: 0
- Storage nur wenn: SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes and a live connector was executed
- No-Secret-Export: ja

## Credential-Manifest
- Referenzen: 0/4
- Externe Connectoren bereit: nein
- Secret-Policy: Only env_ref and present flags are exported; never secret values, tokens, request payloads or webhook URLs.

## Storage Canary
- Status: 
- Gespeichert: 0
- Externe Feeds: nein
- Evidence: https://saferpage.de/sicherheit/feed-storage-canary-json

## Schedule
- Unit: saferpage-security-feed.service
- Timer: saferpage-security-feed.timer
- Fenster: 03:20-03:40 Europe/Berlin plus RandomizedDelaySec 20min

## Betriebs-Runbook
Betriebsnachweis fuer den taeglichen Runner: Timer, letzter Lauf, Dry-Run-Gates, Secret-Schutz, Storage-Freigabe und Stop-Bedingungen sind ohne Secret-Ausgabe pruefbar.

### systemd-Pruefungen
- Timer sichtbar: `systemctl list-timers saferpage-security-feed.timer --no-pager` - NEXT, LAST und UNIT sind sichtbar; Timer ist fuer den taeglichen Lauf geplant.
- Service-Status: `systemctl status saferpage-security-feed.service --no-pager` - Type=oneshot, ExecStart zeigt run-security-feed-schedule.py mit --execute-ready.
- Letzte Logs: `journalctl -u saferpage-security-feed.service -n 80 --no-pager` - Abschlusszeile done evaluated=... errors=0; keine Secret-Werte in Logs.
- Storage-Canary-Timer sichtbar: `systemctl list-timers saferpage-security-feed-canary.timer --no-pager` - Separater Canary-Timer ist sichtbar; Service nutzt --storage-canary ohne --execute-ready.
- Environment-Datei kontrollieren: `systemctl cat saferpage-security-feed.service saferpage-security-feed-canary.service --no-pager` - EnvironmentFile=-/etc/saferpage/security-feed.env ist gesetzt; fehlende Datei blockiert Dry-Run nicht.
- Oeffentlicher State: `curl -fsS https://saferpage.de/sicherheit/feed-runner-json` - JSON enthaelt metrics, last_run.user_agent, schedule und rows ohne Rohpayloads.

### Dry-Run
- Runner lokal ohne externe Feed-Ausfuehrung testen: `python3 scripts/run-security-feed-schedule.py anrufer.info --base-url http://127.0.0.1 --max 1 --timeout 15` - executed_count bleibt 0, stored_observation_count bleibt 0.
- Isolierten Dry-run-Smoke ausfuehren: `scripts/run-security-feed-dry-run-smoke.sh` - Schreibt nur temporaere State-Dateien, external_feed_run_attempt_count=0 und no_secret_export=true.
- Storage-Canary ohne Freigabe blockiert testen: `python3 scripts/run-security-feed-schedule.py anrufer.info --base-url http://127.0.0.1 --max 1 --timeout 15 --storage-canary` - storage_canary.status ist blocked_without_storage_approval und es werden keine externen Feeds abgefragt.
- Aktivierungs-Gates einzeln pruefen: `curl -fsS https://saferpage.de/sicherheit/anrufer.info/feed-activation-json` - activation_ready ist nur true, wenn Credentials, Delivery, Storage- und Review-Gates passend sind.
- Secret-Readiness ohne Secret-Werte pruefen: `curl -fsS https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json` - Nur present/missing und Setup-Vorlagen, keine API-Keys oder Webhook-Secrets.
- Launch-Board vor Freigabe pruefen: `curl -fsS https://saferpage.de/sicherheit/feed-launch-board-json` - status bleibt blocked/approval_required, solange Feed-Credentials oder Storage-Freigabe fehlen.

### Go-Live-Sequenz
- Schritt 1: Migration security-feed-storage.sql pruefen und nur nach Betreiberfreigabe anwenden.
- Schritt 2: Secrets und SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED bei Freigabe in /etc/saferpage/security-feed.env setzen, nie in Unit-Dateien.
- Schritt 3: Nach Storage-Freigabe den separaten Canary-Service starten und storage_canary_stored_observation_count=1 pruefen.
- Schritt 4: systemd daemon-reload ausfuehren und Daily- sowie Canary-Timer kontrollieren.
- Schritt 5: Feed-Approval-Dossier auf recommendation=go bringen und Change-Fenster dokumentieren.
- Schritt 6: Timer manuell mit systemctl start saferpage-security-feed.service ausloesen.
- Schritt 7: feed-runner-json, feed-launch-board-json und Alert-Delivery-Exports nach dem Lauf pruefen.

### Oeffentlicher Vertrag
- Externe Feeds werden nur fuer aktivierungsbereite Domains und nur mit --execute-ready abgefragt.
- Der Storage-Canary laeuft in separater Unit ohne --execute-ready und ruft keine externen Feeds auf.
- Gespeichert werden nur normalisierte Observationen nach Storage-Freigabe, nie Rohpayloads externer Feeds.
- Der User-Agent verweist auf /bot und macht Zweck, Kontakt und Frequenz nachvollziehbar.
- Der oeffentliche State begrenzt Domainzeilen auf 100 und zeigt keine Secret-Werte.

### Stop-Bedingungen
- error_count groesser 0 oder journalctl zeigt wiederholte HTTP-/DB-Fehler.
- executed_count groesser 0, obwohl Approval-Dossier nicht auf go steht.
- stored_observation_count groesser 0 ohne SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes und dokumentierte Freigabe.
- Oeffentliche Exports enthalten API-Keys, Webhook-Secrets, Rohpayloads oder personenbezogene Besucherlogs.
- Timer-Last ueberschreitet geplantes Fenster oder verursacht sichtbare Web-Antwortzeitprobleme.

## Domains
- 85st.co: unavailable, gespeichert 0, https://saferpage.de/sicherheit/85st.co/feed-activation-json
- abda.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/abda.de/feed-activation-json
- klima-mensch-gesundheit.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/klima-mensch-gesundheit.de/feed-activation-json
- klischee-frei.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/klischee-frei.de/feed-activation-json
- klicksafe.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/klicksafe.de/feed-activation-json
- kek-online.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/kek-online.de/feed-activation-json
- blog.wikimedia.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/blog.wikimedia.de/feed-activation-json
- die-medienanstalten.de: unavailable, gespeichert 0, https://saferpage.de/sicherheit/die-medienanstalten.de/feed-activation-json
- kjm-online.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/kjm-online.de/feed-activation-json
- klexikon.zum.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/klexikon.zum.de/feed-activation-json
- karriere.datev.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/karriere.datev.de/feed-activation-json
- kanzleiboerse.datev.de: unavailable, gespeichert 0, https://saferpage.de/sicherheit/kanzleiboerse.datev.de/feed-activation-json
- help-center.apps.datev.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/help-center.apps.datev.de/feed-activation-json
- download.datev.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/download.datev.de/feed-activation-json
- diversity-konferenz.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/diversity-konferenz.de/feed-activation-json
- diversity-reifegrad.de: unavailable, gespeichert 0, https://saferpage.de/sicherheit/diversity-reifegrad.de/feed-activation-json
- datev-mymarketing.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/datev-mymarketing.de/feed-activation-json
- datev-magazin.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/datev-magazin.de/feed-activation-json
- datev-community.de: unavailable, gespeichert 0, https://saferpage.de/sicherheit/datev-community.de/feed-activation-json
- bildungsforum.datev.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/bildungsforum.datev.de/feed-activation-json
- datev-bot.de: unavailable, gespeichert 0, https://saferpage.de/sicherheit/datev-bot.de/feed-activation-json
- apps.datev.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/apps.datev.de/feed-activation-json
- bildung-lernen.datev.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/bildung-lernen.datev.de/feed-activation-json
- datev.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/datev.de/feed-activation-json
- charta-der-vielfalt-e-v.myspreadshop.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/charta-der-vielfalt-e-v.myspreadshop.de/feed-activation-json
- bmfsfj.kita-plattform.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/bmfsfj.kita-plattform.de/feed-activation-json
- bildungsfreaks.de: unavailable, gespeichert 0, https://saferpage.de/sicherheit/bildungsfreaks.de/feed-activation-json
- kita-plattform.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/kita-plattform.de/feed-activation-json
- charta-der-vielfalt.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/charta-der-vielfalt.de/feed-activation-json
- push-pull.net: unavailable, gespeichert 0, https://saferpage.de/sicherheit/push-pull.net/feed-activation-json
- kinofenster.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/kinofenster.de/feed-activation-json
- dkhw.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/dkhw.de/feed-activation-json
- karriere.kbv.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/karriere.kbv.de/feed-activation-json
- kindersache.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/kindersache.de/feed-activation-json
- kbv.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/kbv.de/feed-activation-json
- kindernetz.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/kindernetz.de/feed-activation-json
- hevianna-versicherungsdienst.de: unavailable, gespeichert 0, https://saferpage.de/sicherheit/hevianna-versicherungsdienst.de/feed-activation-json
- events.mcon-mannheim.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/events.mcon-mannheim.de/feed-activation-json
- hebammenverband-olga.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/hebammenverband-olga.de/feed-activation-json
- hebammenkongress.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/hebammenkongress.de/feed-activation-json
- hebammenforum.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/hebammenforum.de/feed-activation-json
- bgw-online.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/bgw-online.de/feed-activation-json
- events.hebammenverband.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/events.hebammenverband.de/feed-activation-json
- dhv-zukunftsforum.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/dhv-zukunftsforum.de/feed-activation-json
- airjordans-retro.com: unavailable, gespeichert 0, https://saferpage.de/sicherheit/airjordans-retro.com/feed-activation-json
- lku.ch: unavailable, gespeichert 0, https://saferpage.de/sicherheit/lku.ch/feed-activation-json
- trace.axd: unavailable, gespeichert 0, https://saferpage.de/sicherheit/trace.axd/feed-activation-json
- login.action: unavailable, gespeichert 0, https://saferpage.de/sicherheit/login.action/feed-activation-json
- hebammenverband.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/hebammenverband.de/feed-activation-json
- gkv-heilmittel.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/gkv-heilmittel.de/feed-activation-json
