{
    "schema": "https://saferpage.de/schemas/security-feed-launch-board.v1",
    "generated_at": "2026-06-09T21:11:09+00:00",
    "domain": "anrufer.info",
    "launch_ready": false,
    "status": "blocked",
    "summary": "anrufer.info: Security-Feed-Launch ist blockiert; 5/7 Gate(s) offen.",
    "metrics": {
        "gate_count": 7,
        "passed_gate_count": 2,
        "blocked_gate_count": 5,
        "latest_smoke_available": 1,
        "latest_smoke_ok": 1,
        "latest_smoke_target_count": 12,
        "latest_smoke_failed_check_count": 0,
        "latest_smoke_blocked_expected_count": 2,
        "latest_smoke_dry_run_executed_count": 0,
        "latest_smoke_dry_run_stored_observation_count": 0,
        "missing_secret_count": 4,
        "missing_database_artifact_count": 11,
        "runner_error_count": 0,
        "runner_executed_count": 0,
        "runner_stored_observation_count": 0,
        "storage_canary_stored_observation_count": 0,
        "parity_item_count": 7,
        "blocked_parity_item_count": 4,
        "security_coverage_item_count": 8,
        "public_security_coverage_count": 8,
        "public_security_coverage_percent": 100,
        "production_secret_coverage_item_count": 5,
        "production_secret_blocked_coverage_count": 5
    },
    "gates": [
        {
            "id": "feed_credentials",
            "label": "Produktive Feed-Credentials",
            "status": "blocked",
            "passed": false,
            "evidence": "anrufer.info: Security-Feed-Secrets mit 4 Secret-Referenz(en), 0 konfiguriert, 4 fehlend.",
            "owner": "IT/Security",
            "next_action": "SAFERPAGE_URLHAUS_AUTH_KEY und SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY serverseitig setzen und Rotation dokumentieren.",
            "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json"
        },
        {
            "id": "storage_schema",
            "label": "Storage-Tabellen, Indizes und Trigger",
            "status": "blocked",
            "passed": false,
            "evidence": "Security-Feed-Storage ist noch nicht schreibbereit: 11 Datenbank-Artefakt(e) fehlen oder die Serverfreigabe ist nicht aktiv.",
            "owner": "DB-Owner",
            "next_action": "Migration Package aus Storage-Readiness anwenden und Smoke-Tests ausführen.",
            "evidence_url": "https://saferpage.de/sicherheit/feed-storage-readiness-json"
        },
        {
            "id": "storage_approval",
            "label": "Betreiberfreigabe für Speicherung",
            "status": "blocked",
            "passed": false,
            "evidence": "Ohne Serverfreigabe bleibt Speicherung deaktiviert, selbst wenn Tabellen vorhanden sind.",
            "owner": "Betreiber/Datenschutz",
            "next_action": "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes erst nach Retention-, Review- und Alert-Routing-Freigabe setzen.",
            "evidence_url": "https://saferpage.de/sicherheit/feed-storage-readiness-json"
        },
        {
            "id": "delivery_signature",
            "label": "Signierte Delivery",
            "status": "blocked",
            "passed": false,
            "evidence": "Signatursecret fehlt; Payloads bleiben Dry-Run.",
            "owner": "IT/Security",
            "next_action": "SAFERPAGE_WEBHOOK_SECRET oder SAFERPAGE_OPERATOR_WEBHOOK_SECRET setzen und HMAC-Dry-Run dokumentieren.",
            "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json"
        },
        {
            "id": "runner_operational",
            "label": "systemd Runner operational",
            "status": "passed",
            "passed": true,
            "evidence": "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.",
            "owner": "Webbetrieb",
            "next_action": "Keine Aktion im Launch-Gate offen; weiterhin überwachen.",
            "evidence_url": "https://saferpage.de/sicherheit/feed-runner-json"
        },
        {
            "id": "runner_guarded",
            "label": "Keine ungeprüften externen Runs oder Speicherungen",
            "status": "passed",
            "passed": true,
            "evidence": "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.",
            "owner": "Webbetrieb/Datenschutz",
            "next_action": "Keine Aktion im Launch-Gate offen; weiterhin überwachen.",
            "evidence_url": "https://saferpage.de/sicherheit/feed-runner-json"
        },
        {
            "id": "activation_ready",
            "label": "Launch-Aktivierung",
            "status": "blocked",
            "passed": false,
            "evidence": "anrufer.info: Security-Feed-Aktivierung mit 5 Gate(s), 4 blockiert, Delivery ohne Secret.",
            "owner": "Programm-Owner",
            "next_action": "Alle blockierten Activation-Gates nacheinander schließen und danach Einzeltest ausführen.",
            "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json"
        }
    ],
    "latest_smoke_result": {
        "schema": "https://saferpage.de/schemas/security-feed-readiness-smoke.v1",
        "generated_at": "2026-06-09T19:39:37+00:00",
        "ok": true,
        "summary": "No-Secret-Smoke fuer Security-Feed-Launch-Board, Credential-Preflight, Storage-Readiness, Runner, Runtime-Kontrollen, Operator-Go-live und isolierten Dry-run.",
        "host": "anrufer.info",
        "source_launch_board_schema": "https://saferpage.de/schemas/security-feed-launch-board.v1",
        "source_launch_board_url": "https://saferpage.de/sicherheit/feed-launch-board-json",
        "metrics": {
            "target_count": 12,
            "http_passed_count": 12,
            "http_failed_count": 0,
            "check_count": 11,
            "failed_check_count": 0,
            "blocked_expected_count": 2,
            "missing_required_secret_reference_count": 3,
            "storage_missing_database_artifact_count": 11,
            "storage_approved": 0,
            "launch_blocked_gate_count": 5,
            "runner_executed_count": 0,
            "runner_stored_observation_count": 0,
            "dry_run_executed_count": 0,
            "dry_run_stored_observation_count": 0,
            "storage_preflight_missing_required_artifact_count": 11,
            "security_notification_digest_available": 1,
            "security_notification_channel_count": 5,
            "security_notification_frequency_count": 3,
            "security_notification_contains_real_recipients": 0
        },
        "checks": [
            {
                "id": "public_routes_http_200",
                "label": "Öffentliche Security-Feed-Readiness-Routen erreichbar",
                "status": "passed",
                "evidence": "12/12 Route(s) liefern HTTP 200.",
                "operator_action": "Weiter mit Go-live-Gates und Runner-Smokes."
            },
            {
                "id": "dry_run_blocks_external_feeds",
                "label": "Dry-run ruft keine externen Feeds auf",
                "status": "passed",
                "evidence": "dry_run_ok=yes, executed_count=0.",
                "operator_action": "Dry-run isoliert halten; echte Feed-Runs nur mit explizitem Execute- und Credential-Gate starten."
            },
            {
                "id": "dry_run_blocks_storage",
                "label": "Dry-run speichert keine Observations",
                "status": "passed",
                "evidence": "stored_observation_count=0.",
                "operator_action": "Storage-Schreibpfad erst nach Migration, Retention-Review und SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED aktivieren."
            },
            {
                "id": "runtime_controls_documented",
                "label": "Security-Feed-Runtime-Kontrollen dokumentiert",
                "status": "passed",
                "evidence": "7 Runtime-Control-Einträge, Execute-/Storage-/Dry-run-Gates geprüft.",
                "operator_action": "Runtime-Controls bei Runner- oder Connector-Änderungen erneut reviewen."
            },
            {
                "id": "credential_blocker_explicit",
                "label": "Produktivblocker Feed-Credentials explizit",
                "status": "blocked_expected",
                "evidence": "missing_required_secret_reference_count=3, external_feed_ready=no.",
                "operator_action": "URLhaus- und Safe-Browsing-Keys nur serverseitig setzen; keine Secret-Werte exportieren."
            },
            {
                "id": "storage_blocker_explicit",
                "label": "Produktivblocker Feed-Storage explizit",
                "status": "blocked_expected",
                "evidence": "missing_database_artifact_count=11, storage_approved=no.",
                "operator_action": "Storage-Migration und Betreiberfreigabe aus sicherer Shell abschließen."
            },
            {
                "id": "launch_board_exposes_blocked_gates",
                "label": "Launch-Board macht Go-live-Blocker sichtbar",
                "status": "passed",
                "evidence": "blocked_gate_count=5, launch_ready=no.",
                "operator_action": "Blockierte Gates im Launch-Board abarbeiten und erneut smoke-testen."
            },
            {
                "id": "operator_go_live_links_security_feed_blocker",
                "label": "Operator-Go-live verlinkt Security-Feed-Blocker",
                "status": "passed",
                "evidence": "Go-live Feed-Phase=yes, feed_runner_available=1, feed_runner_errors=0.",
                "operator_action": "Go-live-Center nach Storage-/Credential-Freigaben erneut prüfen."
            },
            {
                "id": "migration_sql_no_secret_scan",
                "label": "Storage-Migration enthält keine offensichtlichen Secret-Werte",
                "status": "passed",
                "evidence": "Keine Forbidden-Pattern-Treffer.",
                "operator_action": "SQL kann an DB-Owner übergeben werden."
            },
            {
                "id": "security_notification_digest_contract",
                "label": "Security-Notification-Digest öffentlich belegbar",
                "status": "passed",
                "evidence": "channels=5, frequencies=3, digest_available=yes.",
                "operator_action": "Security-Alerts muessen Digest, Frequenzen, Rollen und Exportkanaele ausweisen, bevor externe Zustellung beworben wird."
            },
            {
                "id": "security_notification_no_recipient_leak",
                "label": "Security-Notification ohne echte Empfänger im Public Export",
                "status": "passed",
                "evidence": "digest_contains_real_recipients=no, metric=0, subscription_policy_public_safe=yes.",
                "operator_action": "Nur Rollen, Zweckbindung, Hash-/Statusdaten und Evidence-Links oeffentlich zeigen; echte Empfaenger bleiben im Betreiber-Zielsystem."
            }
        ],
        "failed_checks": [],
        "failed_targets": [],
        "targets": [
            {
                "id": "security_feed_launch_board_json",
                "label": "Security-Feed Launch-Board JSON",
                "url": "https://saferpage.de/sicherheit/feed-launch-board-json",
                "path": "/sicherheit/feed-launch-board-json",
                "expected_http_status": 200,
                "actual_http_status": 200,
                "ok": true,
                "started_at": "2026-06-09T19:39:35Z",
                "finished_at": "2026-06-09T19:39:35Z"
            },
            {
                "id": "security_feed_credential_preflight_json",
                "label": "Security-Feed Credential Preflight JSON",
                "url": "https://saferpage.de/sicherheit/feed-credential-preflight-json?host=anrufer.info",
                "path": "/sicherheit/feed-credential-preflight-json",
                "expected_http_status": 200,
                "actual_http_status": 200,
                "ok": true,
                "started_at": "2026-06-09T19:39:35Z",
                "finished_at": "2026-06-09T19:39:36Z"
            },
            {
                "id": "security_feed_storage_readiness_json",
                "label": "Security-Feed Storage Readiness JSON",
                "url": "https://saferpage.de/sicherheit/feed-storage-readiness-json",
                "path": "/sicherheit/feed-storage-readiness-json",
                "expected_http_status": 200,
                "actual_http_status": 200,
                "ok": true,
                "started_at": "2026-06-09T19:39:36Z",
                "finished_at": "2026-06-09T19:39:36Z"
            },
            {
                "id": "security_feed_runner_json",
                "label": "Security-Feed Runner JSON",
                "url": "https://saferpage.de/sicherheit/feed-runner-json",
                "path": "/sicherheit/feed-runner-json",
                "expected_http_status": 200,
                "actual_http_status": 200,
                "ok": true,
                "started_at": "2026-06-09T19:39:36Z",
                "finished_at": "2026-06-09T19:39:36Z"
            },
            {
                "id": "security_feed_runtime_controls",
                "label": "Security-Feed Runtime Controls",
                "url": "https://saferpage.de/evidence/security-feed-runtime-controls.json",
                "path": "/evidence/security-feed-runtime-controls.json",
                "expected_http_status": 200,
                "actual_http_status": 200,
                "ok": true,
                "started_at": "2026-06-09T19:39:36Z",
                "finished_at": "2026-06-09T19:39:36Z"
            },
            {
                "id": "security_feed_storage_preflight",
                "label": "Security-Feed Storage Preflight",
                "url": "https://saferpage.de/evidence/security-feed-storage-preflight.json",
                "path": "/evidence/security-feed-storage-preflight.json",
                "expected_http_status": 200,
                "actual_http_status": 200,
                "ok": true,
                "started_at": "2026-06-09T19:39:36Z",
                "finished_at": "2026-06-09T19:39:36Z"
            },
            {
                "id": "security_feed_storage_migration_sql",
                "label": "Security-Feed Storage Migration SQL",
                "url": "https://saferpage.de/sicherheit/feed-storage-migration.sql",
                "path": "/sicherheit/feed-storage-migration.sql",
                "expected_http_status": 200,
                "actual_http_status": 200,
                "ok": true,
                "started_at": "2026-06-09T19:39:36Z",
                "finished_at": "2026-06-09T19:39:36Z"
            },
            {
                "id": "operator_go_live_json",
                "label": "Operator Go-live JSON",
                "url": "https://saferpage.de/betreiber/go-live-json",
                "path": "/betreiber/go-live-json",
                "expected_http_status": 200,
                "actual_http_status": 200,
                "ok": true,
                "started_at": "2026-06-09T19:39:36Z",
                "finished_at": "2026-06-09T19:39:36Z"
            },
            {
                "id": "security_feed_secrets_json",
                "label": "Security-Feed Secret Readiness JSON",
                "url": "https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json",
                "path": "/sicherheit/anrufer.info/feed-secrets-json",
                "expected_http_status": 200,
                "actual_http_status": 200,
                "ok": true,
                "started_at": "2026-06-09T19:39:36Z",
                "finished_at": "2026-06-09T19:39:36Z"
            },
            {
                "id": "security_feed_activation_json",
                "label": "Security-Feed Activation JSON",
                "url": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json",
                "path": "/sicherheit/anrufer.info/feed-activation-json",
                "expected_http_status": 200,
                "actual_http_status": 200,
                "ok": true,
                "started_at": "2026-06-09T19:39:36Z",
                "finished_at": "2026-06-09T19:39:36Z"
            },
            {
                "id": "security_alerts_json",
                "label": "Security Alerts JSON",
                "url": "https://saferpage.de/sicherheit/anrufer.info/alerts-json",
                "path": "/sicherheit/anrufer.info/alerts-json",
                "expected_http_status": 200,
                "actual_http_status": 200,
                "ok": true,
                "started_at": "2026-06-09T19:39:36Z",
                "finished_at": "2026-06-09T19:39:36Z"
            },
            {
                "id": "security_alert_delivery_json",
                "label": "Security Alert Delivery JSON",
                "url": "https://saferpage.de/sicherheit/anrufer.info/alerts-delivery-json",
                "path": "/sicherheit/anrufer.info/alerts-delivery-json",
                "expected_http_status": 200,
                "actual_http_status": 200,
                "ok": true,
                "started_at": "2026-06-09T19:39:36Z",
                "finished_at": "2026-06-09T19:39:36Z"
            }
        ],
        "dry_run_smoke": {
            "ok": true,
            "exit_code": 0,
            "evaluated_count": 1,
            "executed_count": 0,
            "stored_observation_count": 0,
            "external_feed_calls_only_if": "activation_ready=true and --execute-ready was passed"
        },
        "no_secret_policy": {
            "contains_secrets": false,
            "contains_feed_raw_payloads": false,
            "contains_private_target_urls": false,
            "contains_recipients": false,
            "contains_private_documents": false,
            "contains_visitor_logs": false,
            "sql_secret_pattern_hits": []
        },
        "claim_boundary": "Dieser Smoke setzt keine Feed-Credentials, ruft keine externen Malware-/Safe-Browsing-Feeds auf, speichert keine echten Observations, versendet keine Alerts und wendet keine Migration an.",
        "available": true,
        "status": "passed",
        "url": "https://saferpage.de/evidence/security-feed-readiness-smoke.json"
    },
    "competitor_parity": {
        "reference_pattern": "DACH-Security-Scanner mit Score, Siegel, täglicher Prüfung, Alarmierung, Malware-/Blacklist-/Phishing-/DAST-Signalen und vollständigem Sicherheitsbericht.",
        "status": "parity_blocked_until_feed_go_live",
        "blocked_item_count": 4,
        "items": [
            {
                "id": "security_score_report",
                "expectation": "Gesamtscore und vollständiger Sicherheitsbericht",
                "saferpage_evidence": "DACH-Sicherheitsprofil mit TLS, Headern, Redirects, Cookies, Script-/Version-Signalen, Runbook, JSON/CSV/Markdown und Kurzreport-Verlinkung.",
                "status": "abgedeckt",
                "owner": "IT/Security",
                "next_action": "Security-Profil regelmäßig in Monitoring und Betreiber-Board prüfen.",
                "evidence_url": "https://saferpage.de/sicherheit/anrufer.info"
            },
            {
                "id": "security_badge",
                "expectation": "Öffentliches Siegel oder Badge mit Prüfstatus",
                "saferpage_evidence": "Einbettbares Sicherheitsbadge mit Score, Nachweislinks, Badge-JSON und klarer Nicht-Zertifikat-Policy.",
                "status": "abgedeckt",
                "owner": "Website-Betrieb",
                "next_action": "Badge nur mit korrekter Aussage einbetten und bei Score-Änderungen Re-Scan auslösen.",
                "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/badge"
            },
            {
                "id": "operator_alerts",
                "expectation": "Benachrichtigung bei kritischen Security-Befunden",
                "saferpage_evidence": "Security-Alerts und Delivery-Payloads für Webhook, Slack, Teams, Jira und E-Mail sind erzeugbar; HMAC-Secret bleibt Launch-Gate.",
                "status": "blockiert",
                "owner": "IT/Security",
                "next_action": "Webhook-/Operator-Secret setzen und signierten Delivery-Dry-Run prüfen.",
                "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/alerts-delivery-json"
            },
            {
                "id": "daily_feed_monitoring",
                "expectation": "Tägliche Malware-/Blacklist-/Phishing-Prüfung registrierter Domains",
                "saferpage_evidence": "Schedule, systemd Runner, Credential-Preflight, Secret-Readiness, Storage-Plan und Launch-Board sind vorhanden; externe Feed-Runs bleiben bis Credentials/Freigabe gesperrt.",
                "status": "blockiert",
                "owner": "Programm-Owner",
                "next_action": "Credential-Preflight, Storage-Freigabe und blockierte Launch-Gates schließen.",
                "evidence_url": "https://saferpage.de/sicherheit/feed-credential-preflight-json?host=anrufer.info"
            },
            {
                "id": "feed_storage_review",
                "expectation": "Trefferhistorie, Dedupe, Review und Auditlog",
                "saferpage_evidence": "Storage-Vertrag, Retention, erlaubte/verbotene Felder, DB-Readiness und Approval-Dossier sind getrennt nachweisbar.",
                "status": "blockiert",
                "owner": "DB-Owner/Datenschutz",
                "next_action": "DDL-Migration anwenden und Storage-Freigabe erst nach Retention-/Review-Entscheidung setzen.",
                "evidence_url": "https://saferpage.de/sicherheit/feed-storage-readiness-json"
            },
            {
                "id": "storage_canary",
                "expectation": "Produktionsnaher Schreibpfad-Test ohne externe Feed-Abfrage",
                "saferpage_evidence": "Privater Storage-Canary definiert synthetische Observation, Dedupe, Retention, Auditlog, verbotene Felder, eigene systemd-Unit mit Timer und letzten Runner-Status getrennt von echten Feed-Runs.",
                "status": "offen",
                "owner": "DB-Owner/Webbetrieb",
                "next_action": "Storage-Canary-Timer prüfen, nach Tabellen-/Freigabe-Gate kontrolliert starten und Runner-State prüfen.",
                "evidence_url": "https://saferpage.de/sicherheit/feed-storage-canary-json"
            },
            {
                "id": "external_validation_plan",
                "expectation": "Externe DAST-/DOM-XSS-/CMS-/Malware-Nachweise",
                "saferpage_evidence": "Betreiber-Prüfplan mit Akzeptanzkriterien, Ownern und Exportlinks markiert externe Validierungen, die SaferPage nicht aus öffentlichem Scan behauptet.",
                "status": "abgedeckt",
                "owner": "IT/Security",
                "next_action": "Externe Prüfungen beauftragen oder Evidenz hochladen; SaferPage-Report danach gegen Re-Scan abgleichen.",
                "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/extern-json"
            }
        ]
    },
    "security_coverage": {
        "status": "public_evidence_ready_feed_go_live_blocked",
        "summary": "8/8 Security-Coverage-Punkte sind öffentlich belegbar; 5 produktive Feed-/Storage-/Delivery-Punkte warten auf sichere Secrets oder Freigaben.",
        "public_coverage_percent": 100,
        "items": [
            {
                "id": "tls_headers_profile",
                "label": "TLS, Security-Header und Redirect-Signale",
                "area": "passive_scan",
                "status": "covered",
                "covered_publicly": true,
                "requires_production_secret": false,
                "evidence": "DACH-Sicherheitsprofil exportiert TLS-/Header-/Security-Signale ohne externe Feed-Secrets.",
                "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/export"
            },
            {
                "id": "security_score_badge",
                "label": "Score und Badge mit Claim-Grenzen",
                "area": "public_trust",
                "status": "covered",
                "covered_publicly": true,
                "requires_production_secret": false,
                "evidence": "Sicherheitsbadge, Scorecard und Verifizierungsseiten sind öffentlich verlinkt.",
                "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/badge-json"
            },
            {
                "id": "security_alert_delivery_contract",
                "label": "Security-Alerts und Delivery-Vertrag",
                "area": "alerting",
                "status": "guarded_ready",
                "covered_publicly": true,
                "requires_production_secret": true,
                "evidence": "Alert-Payloads, HMAC-Receiver-Vertrag, Idempotency und Delivery-Preflight sind vorhanden; echte Zustellung wartet auf Freigabe.",
                "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/alerts-delivery-json"
            },
            {
                "id": "feed_evidence_contract",
                "label": "Malware-/Blacklist-/Phishing-Feed-Vertrag",
                "area": "external_feed",
                "status": "guarded_ready",
                "covered_publicly": true,
                "requires_production_secret": true,
                "evidence": "Feed-Evidence, Import-Preview, Live-Connector-Vertrag und Credential-Preflight sind vorhanden; externe Feed-Abfrage läuft nicht im Standard.",
                "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-signale-json"
            },
            {
                "id": "feed_runner_operations",
                "label": "Geplanter Feed-Runner mit Stop-Bedingungen",
                "area": "operations",
                "status": "covered",
                "covered_publicly": true,
                "requires_production_secret": true,
                "evidence": "systemd Runner-State, Schedule, Dry-run-Drill, Go-live-Sequenz und Stop-Bedingungen sind öffentlich belegbar.",
                "evidence_url": "https://saferpage.de/sicherheit/feed-runner-json"
            },
            {
                "id": "feed_storage_readiness",
                "label": "Storage, Retention, Dedupe und Auditlog",
                "area": "storage",
                "status": "guarded_ready",
                "covered_publicly": true,
                "requires_production_secret": true,
                "evidence": "Storage-Vertrag, Migration-SQL, Preflight, Readiness, Canary und Approval-Dossier sind getrennt belegbar.",
                "evidence_url": "https://saferpage.de/sicherheit/feed-storage-readiness-json"
            },
            {
                "id": "external_validation_plan",
                "label": "Externe DAST-/DOM-XSS-/CMS-Nachweise",
                "area": "external_validation",
                "status": "covered",
                "covered_publicly": true,
                "requires_production_secret": false,
                "evidence": "Externer Prüfplan markiert, welche Nachweise Betreiber zusätzlich liefern oder beauftragen müssen.",
                "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/extern-json"
            },
            {
                "id": "launch_go_no_go_dossier",
                "label": "Go/No-Go-Freigabeakte",
                "area": "go_live",
                "status": "guarded_ready",
                "covered_publicly": true,
                "requires_production_secret": true,
                "evidence": "Launch-Board und Approval-Dossier bündeln Gates, Signoffs, Risiken, Environment-Vertrag und Evidence-Links ohne Secret-Ausgabe.",
                "evidence_url": "https://saferpage.de/sicherheit/feed-approval-dossier-json"
            }
        ],
        "claim_guardrails": [
            "SaferPage behauptet keine Malware-/Blacklist-Clean-Entscheidung ohne ausgeführte externe Feed-Connectoren.",
            "Badge und Sicherheitsprofil sind öffentliche Prüfhinweise, kein Zertifikat und kein Penetrationstest.",
            "Produktive Alerts, Feed-Speicherung und externe Feed-Abfragen benötigen explizite Betreiberfreigabe und Server-Secrets."
        ]
    },
    "blocked_actions": [
        {
            "gate": "feed_credentials",
            "owner": "IT/Security",
            "action": "SAFERPAGE_URLHAUS_AUTH_KEY und SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY serverseitig setzen und Rotation dokumentieren.",
            "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json"
        },
        {
            "gate": "storage_schema",
            "owner": "DB-Owner",
            "action": "Migration Package aus Storage-Readiness anwenden und Smoke-Tests ausführen.",
            "evidence_url": "https://saferpage.de/sicherheit/feed-storage-readiness-json"
        },
        {
            "gate": "storage_approval",
            "owner": "Betreiber/Datenschutz",
            "action": "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes erst nach Retention-, Review- und Alert-Routing-Freigabe setzen.",
            "evidence_url": "https://saferpage.de/sicherheit/feed-storage-readiness-json"
        },
        {
            "gate": "delivery_signature",
            "owner": "IT/Security",
            "action": "SAFERPAGE_WEBHOOK_SECRET oder SAFERPAGE_OPERATOR_WEBHOOK_SECRET setzen und HMAC-Dry-Run dokumentieren.",
            "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json"
        },
        {
            "gate": "activation_ready",
            "owner": "Programm-Owner",
            "action": "Alle blockierten Activation-Gates nacheinander schließen und danach Einzeltest ausführen.",
            "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json"
        }
    ],
    "operator_sequence": [
        "DB-Owner Migration Package aus Storage-Readiness anwenden lassen.",
        "Credential-Preflight prüfen und Feed-/Delivery-Secrets serverseitig ohne Secret-Ausgabe nachweisen.",
        "Feed- und Delivery-Secrets serverseitig setzen; keine Secret-Werte veröffentlichen.",
        "Storage-Freigabe erst nach Retention-/Review-/Alert-Routing-Entscheidung aktivieren.",
        "Runner manuell starten, Launch-Board prüfen und erst dann Daily-Betrieb als produktiv markieren."
    ],
    "source_packages": {
        "secrets": "https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json",
        "activation": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json",
        "storage_readiness": "https://saferpage.de/sicherheit/feed-storage-readiness-json",
        "storage_canary": "https://saferpage.de/sicherheit/feed-storage-canary-json",
        "runner_state": "https://saferpage.de/sicherheit/feed-runner-json"
    },
    "links": {
        "html": "https://saferpage.de/sicherheit/feed-launch-board",
        "json": "https://saferpage.de/sicherheit/feed-launch-board-json",
        "csv": "https://saferpage.de/sicherheit/feed-launch-board-csv",
        "markdown": "https://saferpage.de/sicherheit/feed-launch-board-md",
        "approval_dossier": "https://saferpage.de/sicherheit/feed-approval-dossier-json",
        "credential_preflight": "https://saferpage.de/sicherheit/feed-credential-preflight-json?host=anrufer.info",
        "storage_readiness": "https://saferpage.de/sicherheit/feed-storage-readiness-json",
        "storage_canary": "https://saferpage.de/sicherheit/feed-storage-canary-json",
        "runner": "https://saferpage.de/sicherheit/feed-runner-json",
        "readiness_smoke": "https://saferpage.de/evidence/security-feed-readiness-smoke.json",
        "secrets": "https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json",
        "activation": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json",
        "comparison": "https://saferpage.de/vergleich/features-json"
    },
    "disclaimer": "Launch-Board aggregiert öffentliche Evidence-Pakete. Es ruft keine externen Malware-Feeds auf, speichert keine Treffer und veröffentlicht keine Secret-Werte."
}
