# SaferPage Security-Feed-Runner

Security-Feed-Runner: 50 Domain(s) geprüft, 0 aktivierungsbereit, 0 externe Feed-Run(s), 0 Observation(s) gespeichert, 0 durch Gates blockiert, 0 ohne Reportseite, 50 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-08-22T01:21:53+00:00
- Ende: 2026-08-22T01:21:54+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 für den täglichen Runner: Timer, letzter Lauf, Dry-Run-Gates, Secret-Schutz, Storage-Freigabe und Stop-Bedingungen sind ohne Secret-Ausgabe prüfbar.

### systemd-Prüfungen
- Timer sichtbar: `systemctl list-timers saferpage-security-feed.timer --no-pager` - NEXT, LAST und UNIT sind sichtbar; Timer ist für den täglichen 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.
- Öffentlicher State: `curl -fsS https://saferpage.de/sicherheit/feed-runner-json` - JSON enthält metrics, last_run.user_agent, schedule und rows ohne Rohpayloads.

### Dry-Run
- Runner lokal ohne externe Feed-Ausführung 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 ausführen: `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 prüfen: `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 prüfen: `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 prüfen: `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 prüfen 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 prüfen.
- Schritt 4: systemd daemon-reload ausführen 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 auslösen.
- Schritt 7: feed-runner-json, feed-launch-board-json und Alert-Delivery-Exports nach dem Lauf prüfen.

### Öffentlicher Vertrag
- Externe Feeds werden nur für aktivierungsbereite Domains und nur mit --execute-ready abgefragt.
- Der Storage-Canary läuft 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 öffentliche State begrenzt Domainzeilen auf 100 und zeigt keine Secret-Werte.

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

## Domains
- polarisone.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/polarisone.de/feed-activation-json
- usenext.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/usenext.de/feed-activation-json
- tourismus.zella-mehlis.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/tourismus.zella-mehlis.de/feed-activation-json
- pth-hamburg.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/pth-hamburg.de/feed-activation-json
- mzv-biedenkopf.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/mzv-biedenkopf.de/feed-activation-json
- tourismus.bad-lausick.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/tourismus.bad-lausick.de/feed-activation-json
- mystrom.ch: blocked, gespeichert 0, https://saferpage.de/sicherheit/mystrom.ch/feed-activation-json
- tortenboss.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/tortenboss.de/feed-activation-json
- nabu-naturgucker-beobachtungen.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/nabu-naturgucker-beobachtungen.de/feed-activation-json
- pruefen.h-da.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/pruefen.h-da.de/feed-activation-json
- psychologie-des-gluecks.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/psychologie-des-gluecks.de/feed-activation-json
- provi-hiltrup.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/provi-hiltrup.de/feed-activation-json
- psm-pv.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/psm-pv.de/feed-activation-json
- pruckis.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/pruckis.de/feed-activation-json
- psychiatricum-ka.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/psychiatricum-ka.de/feed-activation-json
- psychosomatik.med.ovgu.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/psychosomatik.med.ovgu.de/feed-activation-json
- prothetik.charite.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/prothetik.charite.de/feed-activation-json
- proserv-dl.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/proserv-dl.de/feed-activation-json
- proof-management.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/proof-management.de/feed-activation-json
- promidaten.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/promidaten.de/feed-activation-json
- promizeiten.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/promizeiten.de/feed-activation-json
- promotion.michelin.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/promotion.michelin.de/feed-activation-json
- prok-raeder.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/prok-raeder.de/feed-activation-json
- promotion.charite.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/promotion.charite.de/feed-activation-json
- propagation.dr2w.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/propagation.dr2w.de/feed-activation-json
- profi-tess.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/profi-tess.de/feed-activation-json
- progress-mma.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/progress-mma.de/feed-activation-json
- proglass.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/proglass.de/feed-activation-json
- projektcircus.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/projektcircus.de/feed-activation-json
- projekt.energieversum.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/projekt.energieversum.de/feed-activation-json
- profishop.birlenbach.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/profishop.birlenbach.de/feed-activation-json
- prohaltefrist.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/prohaltefrist.de/feed-activation-json
- programmkinosaugsburg.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/programmkinosaugsburg.de/feed-activation-json
- profilschuleluenen.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/profilschuleluenen.de/feed-activation-json
- profident-zahnarzt.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/profident-zahnarzt.de/feed-activation-json
- profi-ersatzteile.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/profi-ersatzteile.de/feed-activation-json
- prof-haupt.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/prof-haupt.de/feed-activation-json
- profi-mueller.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/profi-mueller.de/feed-activation-json
- profidusch.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/profidusch.de/feed-activation-json
- profil.lgl-bw.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/profil.lgl-bw.de/feed-activation-json
- profile.uni-koblenz.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/profile.uni-koblenz.de/feed-activation-json
- profahr.mvg-mobil.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/profahr.mvg-mobil.de/feed-activation-json
- proeco-rheinland.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/proeco-rheinland.de/feed-activation-json
- produkte-im-test.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/produkte-im-test.de/feed-activation-json
- profagus.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/profagus.de/feed-activation-json
- produktpreisfinder.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/produktpreisfinder.de/feed-activation-json
- professorenkatalog.uni-koeln.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/professorenkatalog.uni-koeln.de/feed-activation-json
- produkte.igmetall.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/produkte.igmetall.de/feed-activation-json
- produkte.hypovereinsbank.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/produkte.hypovereinsbank.de/feed-activation-json
- nachruf.meine-gedenktafel.de: blocked, gespeichert 0, https://saferpage.de/sicherheit/nachruf.meine-gedenktafel.de/feed-activation-json
