{
    "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."
}
