{
    "schema": "https://saferpage.de/schemas/operator-go-live-command-center.v1",
    "generated_at": "2026-06-09T21:12:53+00:00",
    "available": true,
    "status": "waiting_for_secure_inputs",
    "summary": "Operator-Go-live: 0/3 Aktivierungsbereiche bereit, 3 warten auf sichere Eingaben oder Freigaben.",
    "metrics": {
        "phase_count": 3,
        "ready_phase_count": 0,
        "blocked_phase_count": 3,
        "required_env_ref_count": 20,
        "safe_command_count": 9,
        "evidence_url_count": 16,
        "no_secret_smoke_count": 7,
        "no_secret_smoke_ok_count": 7,
        "no_secret_smoke_target_count": 159,
        "no_secret_smoke_failed_check_count": 0,
        "no_secret_smoke_blocked_expected_count": 5,
        "crawler_readiness_smoke_available": 1,
        "crawler_readiness_smoke_ok": 1,
        "crawler_readiness_smoke_target_count": 10,
        "crawler_readiness_smoke_failed_check_count": 0,
        "trust_readiness_smoke_available": 1,
        "trust_readiness_smoke_ok": 1,
        "trust_readiness_smoke_target_count": 32,
        "trust_readiness_smoke_failed_check_count": 0,
        "competitive_source_availability_smoke_available": 1,
        "competitive_source_availability_smoke_ok": 1,
        "competitive_source_availability_smoke_target_count": 14,
        "competitive_source_availability_smoke_failed_check_count": 0,
        "api_key_readiness_smoke_available": 1,
        "api_key_readiness_smoke_ok": 1,
        "api_key_readiness_smoke_target_count": 6,
        "api_key_readiness_smoke_failed_check_count": 0,
        "delivery_runtime_control_count": 8,
        "alert_runner_available": 1,
        "alert_outbox_count": 64,
        "alert_sent_count": 0,
        "alert_error_count": 0,
        "alert_delivery_readiness_smoke_available": 1,
        "alert_delivery_readiness_smoke_ok": 1,
        "alert_delivery_readiness_smoke_target_count": 6,
        "alert_delivery_readiness_smoke_failed_check_count": 0,
        "alert_delivery_readiness_smoke_blocked_expected_count": 1,
        "alert_delivery_readiness_smoke_dry_run_sent_count": 0,
        "alert_delivery_readiness_smoke_runner_sent_count": 0,
        "feed_runner_available": 1,
        "feed_runner_executed_count": 0,
        "feed_runner_stored_observation_count": 0,
        "feed_runner_error_count": 0,
        "security_feed_readiness_smoke_available": 1,
        "security_feed_readiness_smoke_ok": 1,
        "security_feed_readiness_smoke_target_count": 12,
        "security_feed_readiness_smoke_failed_check_count": 0,
        "security_feed_readiness_smoke_blocked_expected_count": 2,
        "security_feed_readiness_smoke_dry_run_executed_count": 0,
        "security_feed_readiness_smoke_dry_run_stored_observation_count": 0,
        "security_feed_storage_preflight_available": 1,
        "security_feed_storage_preflight_database_reachable": 1,
        "security_feed_storage_preflight_admin_dsn_required": 1,
        "security_feed_storage_preflight_missing_artifact_count": 11,
        "api_runtime_control_count": 8,
        "api_access_storage_table_count": 0,
        "api_gate_passed_count": 0,
        "api_access_preflight_available": 1,
        "api_access_preflight_database_reachable": 1,
        "api_access_preflight_admin_dsn_required": 1,
        "api_access_preflight_missing_artifact_count": 2,
        "operator_approval_queue_count": 3,
        "operator_approval_waiting_count": 3,
        "competitive_evidence_health_available": 1,
        "competitive_evidence_health_ok": 1,
        "competitive_evidence_health_target_count": 79,
        "competitive_evidence_health_passed_count": 79,
        "competitive_evidence_health_failed_count": 0,
        "competitive_evidence_health_http_failed_count": 0,
        "competitive_evidence_health_contract_check_count": 7,
        "competitive_evidence_health_contract_failed_count": 0,
        "competitive_evidence_health_open_benchmark_count": 2,
        "competitive_evidence_health_open_action_count": 2,
        "competitive_evidence_health_open_public_evidence_url_count": 4,
        "competitive_evidence_health_open_runbook_link_count": 13,
        "competitive_evidence_health_use_case_segment_count": 8,
        "competitive_evidence_health_use_case_segment_next_action_count": 8,
        "competitive_evidence_health_use_case_segment_public_evidence_url_count": 8,
        "competitive_evidence_health_use_case_decision_path_count": 8,
        "competitive_evidence_health_use_case_decision_path_evidence_count": 8,
        "competitive_evidence_health_use_case_gated_decision_path_count": 3
    },
    "activation_sequence": [
        "Oeffentliche Evidence zuerst pruefen und unveraendert archivieren; Evidence-Health muss vor Produktivfreigabe gruen sein.",
        "Secrets, Ziel-URLs und DSN ausschliesslich im Server-Environment oder Secret Manager setzen.",
        "Dry-runs und Preflights ausfuehren, bevor ein Go-live-Gate aktiviert wird.",
        "Betreiberfreigabe mit Scope, Owner, Smoke-Referenzen, Ablaufdatum und Rollback-Owner dokumentieren.",
        "Nach jeder Freigabe Live-JSON, Runner-State, Sitemap und Parity-Board erneut pruefen."
    ],
    "competitive_evidence_health": {
        "available": true,
        "url": "https://saferpage.de/evidence/competitive-evidence-health-smoke.json",
        "status": "ok",
        "ok": true,
        "generated_at": "2026-06-09T20:52:26+00:00",
        "summary": "Sanitisierter Smoke-Lauf fuer die oeffentlichen SaferPage-Wettbewerbs-Evidence-Routen und Benchmark-Linkvertraege.",
        "source_health_url": "https://saferpage.de/vergleich/evidence-health-json",
        "metrics": {
            "target_count": 79,
            "passed_count": 79,
            "failed_count": 0,
            "http_failed_count": 0,
            "contract_check_count": 7,
            "contract_failed_count": 0,
            "open_benchmark_count": 2,
            "open_action_count": 2,
            "open_public_evidence_url_count": 4,
            "open_runbook_link_count": 13,
            "use_case_segment_count": 8,
            "use_case_segment_next_action_count": 8,
            "use_case_segment_public_evidence_url_count": 8,
            "use_case_decision_path_count": 8,
            "use_case_decision_path_evidence_count": 8,
            "use_case_gated_decision_path_count": 3
        },
        "no_secret_policy": {
            "contains_secrets": false,
            "contains_private_target_urls": false,
            "contains_recipients": false,
            "contains_private_documents": false,
            "contains_visitor_logs": false
        },
        "operator_action": "Öffentliche Evidence ist grün; Produktiv-Gates bleiben trotzdem an Secrets, Betreiberfreigabe und phasenspezifische Smokes gebunden."
    },
    "no_secret_smokes": [
        {
            "id": "crawler_readiness_smoke",
            "label": "DACH Crawler Readiness Smoke",
            "available": true,
            "url": "https://saferpage.de/evidence/crawler-readiness-smoke.json",
            "status": "ok",
            "ok": true,
            "generated_at": "2026-06-09T21:05:01+00:00",
            "summary": "No-Secret-Smoke fuer DACH-Crawler-Operations, Timer-Runner, User-Agent, Seedquelle, Performance-Grenzen, Recent-Reportlinks und Screenshot-Preview-Coverage.",
            "metrics": {
                "target_count": 10,
                "http_passed_count": 10,
                "http_failed_count": 0,
                "check_count": 12,
                "passed_check_count": 10,
                "warning_check_count": 2,
                "failed_check_count": 0,
                "crawler_available": 1,
                "timer_available": 1,
                "dach_check_count": 702,
                "queue_count": 626,
                "seed_file_host_count": 86,
                "recent_report_count": 36,
                "test_index_visible_count": 200,
                "test_index_total_public_checks": 714,
                "test_index_preview_coverage_percent": 100,
                "test_index_preview_missing_count": 0,
                "test_index_preview_legacy_size_count": 648,
                "test_index_preview_contract_width": 160,
                "test_index_preview_contract_height": 150,
                "test_index_preview_contract_fit": "contain",
                "test_index_preview_contract_source_capture": "full_page",
                "test_index_preview_contract_capture_version": "contain-v3-fullpage-to-160x150",
                "test_index_crawler_german_count": 702,
                "preview_coverage_percent": 100,
                "preview_missing_count": 0,
                "error_rate_percent": 2.95,
                "max_hosts_per_run": 8,
                "concurrency": 2,
                "timeout_seconds": 90,
                "timer_gate_count": 11,
                "timer_passed_gate_count": 11,
                "timer_warning_gate_count": 0,
                "timer_blocked_gate_count": 0,
                "blocked_expected_count": 0
            },
            "no_secret_policy": {
                "contains_secrets": false,
                "contains_private_target_urls": false,
                "contains_recipients": false,
                "contains_private_documents": false,
                "contains_visitor_logs": false,
                "forbidden_pattern_hits": false
            },
            "operator_action": "No-Secret-Smoke ist grün und als öffentliche Go-live-Evidence verwendbar."
        },
        {
            "id": "trust_readiness_smoke",
            "label": "Trust-Readiness Smoke",
            "available": true,
            "url": "https://saferpage.de/evidence/trust-readiness-smoke.json",
            "status": "ok",
            "ok": true,
            "generated_at": "2026-06-09T19:44:29+00:00",
            "summary": "No-Secret-Smoke fuer Trust-Readiness, Gated-Trust-Dossier, Viewer-Datenschutz, Questionnaire-Review, Export-Blueprints, Data-Room-Gates und Public-Evidence-Linkvertrag.",
            "metrics": {
                "target_count": 32,
                "http_passed_count": 32,
                "http_failed_count": 0,
                "check_count": 12,
                "passed_check_count": 11,
                "warning_check_count": 0,
                "failed_check_count": 0,
                "blocked_expected_count": 1,
                "trust_readiness_item_count": 120,
                "public_links_per_domain": 28,
                "public_evidence_link_count": 3360,
                "public_trust_module_count": 28,
                "advanced_trust_module_target_count": 13,
                "advanced_trust_module_passed_count": 13,
                "preview_contract_width": 160,
                "preview_contract_height": 150,
                "preview_contract_fit": "contain",
                "preview_contract_source_capture": "full_page",
                "preview_contract_capture_version": "contain-v3-fullpage-to-160x150",
                "gated_public_trust_coverage_percent": 100,
                "gated_blocked_gate_count": 7,
                "gated_pending_gate_count": 2,
                "questionnaire_review_readiness_score": 100,
                "questionnaire_review_lane_count": 5,
                "questionnaire_approval_gate_count": 6,
                "questionnaire_assignment_group_count": 5,
                "questionnaire_delegation_suggestion_count": 6,
                "questionnaire_notification_digest_available": 1,
                "questionnaire_notification_channel_count": 5,
                "questionnaire_notification_frequency_count": 3,
                "questionnaire_notification_contains_real_recipients": 0
            },
            "no_secret_policy": {
                "contains_secrets": false,
                "contains_private_target_urls": false,
                "contains_recipients": false,
                "contains_private_documents": false,
                "contains_visitor_logs": false,
                "contains_magic_links": false,
                "forbidden_pattern_hits": false
            },
            "operator_action": "No-Secret-Smoke ist grün und als öffentliche Go-live-Evidence verwendbar."
        },
        {
            "id": "competitive_source_availability_smoke",
            "label": "Competitive Source Availability Smoke",
            "available": true,
            "url": "https://saferpage.de/evidence/competitive-source-availability-smoke.json",
            "status": "ok",
            "ok": true,
            "generated_at": "2026-06-09T20:04:41+00:00",
            "summary": "Sanitisierter Availability-Smoke fuer offizielle Wettbewerbs-Primärquellen aus dem SaferPage Quellen-Watch.",
            "metrics": {
                "source_count": 14,
                "reachable_count": 12,
                "manual_review_required_count": 2,
                "client_error_review_required_count": 0,
                "server_error_count": 0,
                "transport_failed_count": 0,
                "hard_failure_count": 0,
                "target_count": 14,
                "check_count": 14,
                "failed_check_count": 0,
                "blocked_expected_count": 0
            },
            "no_secret_policy": {
                "contains_secrets": false,
                "contains_private_target_urls": false,
                "contains_recipients": false,
                "contains_private_documents": false,
                "contains_visitor_logs": false
            },
            "operator_action": "No-Secret-Smoke ist grün und als öffentliche Go-live-Evidence verwendbar."
        },
        {
            "id": "competitive_evidence_health_smoke",
            "label": "Competitive Evidence Health Smoke",
            "available": true,
            "url": "https://saferpage.de/evidence/competitive-evidence-health-smoke.json",
            "status": "ok",
            "ok": true,
            "generated_at": "2026-06-09T20:52:26+00:00",
            "summary": "Sanitisierter Smoke-Lauf fuer die oeffentlichen SaferPage-Wettbewerbs-Evidence-Routen und Benchmark-Linkvertraege.",
            "metrics": {
                "target_count": 79,
                "passed_count": 79,
                "failed_count": 0,
                "http_failed_count": 0,
                "contract_check_count": 7,
                "contract_failed_count": 0,
                "open_benchmark_count": 2,
                "open_action_count": 2,
                "open_public_evidence_url_count": 4,
                "open_runbook_link_count": 13,
                "use_case_segment_count": 8,
                "use_case_segment_next_action_count": 8,
                "use_case_segment_public_evidence_url_count": 8,
                "use_case_decision_path_count": 8,
                "use_case_decision_path_evidence_count": 8,
                "use_case_gated_decision_path_count": 3,
                "check_count": 7,
                "failed_check_count": 0,
                "blocked_expected_count": 0
            },
            "no_secret_policy": {
                "contains_secrets": false,
                "contains_private_target_urls": false,
                "contains_recipients": false,
                "contains_private_documents": false,
                "contains_visitor_logs": false
            },
            "operator_action": "Öffentliche Evidence ist grün; Produktiv-Gates bleiben trotzdem an Secrets, Betreiberfreigabe und phasenspezifische Smokes gebunden."
        },
        {
            "id": "alert_delivery_readiness_smoke",
            "label": "Alert-Delivery Readiness Smoke",
            "available": true,
            "url": "https://saferpage.de/evidence/alert-delivery-readiness-smoke.json",
            "status": "ok",
            "ok": true,
            "generated_at": "2026-06-09T17:46:10+00:00",
            "summary": "No-Secret-Smoke fuer Alert-Delivery-Preflight, Dispatch-Runner, Runtime-Kontrollen, Delivery-Fixture, Operator-Go-live und isolierten Dry-run.",
            "metrics": {
                "target_count": 6,
                "failed_check_count": 0,
                "blocked_expected_count": 1,
                "dispatch_approved": 0,
                "native_ready_channel_count": 1,
                "dry_run_sent_count": 0,
                "runner_sent_count": 0
            },
            "no_secret_policy": {
                "contains_secrets": false,
                "contains_target_urls": false,
                "contains_recipients": false,
                "contains_raw_payloads": false,
                "contains_private_documents": false,
                "contains_visitor_logs": false,
                "public_export_secret_pattern_hits": false
            },
            "operator_action": "Alert-Delivery-Smoke ist grün: öffentliche Nachweise sind erreichbar, erwartete Produktivblocker sind sichtbar und Dry-run/Runner haben keine Alerts versendet."
        },
        {
            "id": "security_feed_readiness_smoke",
            "label": "Security-Feed Readiness Smoke",
            "available": true,
            "url": "https://saferpage.de/evidence/security-feed-readiness-smoke.json",
            "status": "ok",
            "ok": true,
            "generated_at": "2026-06-09T19:39:37+00:00",
            "summary": "No-Secret-Smoke fuer Security-Feed-Launch-Board, Credential-Preflight, Storage-Readiness, Runner, Runtime-Kontrollen, Operator-Go-live und isolierten Dry-run.",
            "metrics": {
                "target_count": 12,
                "failed_check_count": 0,
                "blocked_expected_count": 2,
                "missing_required_secret_reference_count": 3,
                "storage_missing_database_artifact_count": 11,
                "dry_run_executed_count": 0,
                "dry_run_stored_observation_count": 0
            },
            "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": false
            },
            "operator_action": "Security-Feed-Smoke ist grün: öffentliche Nachweise sind erreichbar, erwartete Produktivblocker sind sichtbar und der Dry-run hat keine externen Feeds ausgeführt oder Observations gespeichert."
        },
        {
            "id": "api_key_readiness_smoke",
            "label": "API-Key Readiness Smoke",
            "available": true,
            "url": "https://saferpage.de/evidence/api-key-readiness-smoke.json",
            "status": "ok",
            "ok": true,
            "generated_at": "2026-06-09T19:20:35+00:00",
            "summary": "No-Secret-Smoke fuer API-Key-Readiness, Migration-Preflight, Runtime-Gates und Operator-Go-live-Verknuepfung.",
            "metrics": {
                "target_count": 6,
                "http_passed_count": 6,
                "http_failed_count": 0,
                "check_count": 6,
                "failed_check_count": 0,
                "blocked_expected_count": 1,
                "api_access_storage_table_count": 0,
                "api_access_storage_ready": 0,
                "missing_required_artifact_count": 2,
                "runtime_implementation_passed_count": 7,
                "runtime_implementation_gate_count": 7
            },
            "no_secret_policy": {
                "contains_secrets": false,
                "contains_private_target_urls": false,
                "contains_recipients": false,
                "contains_private_documents": false,
                "contains_visitor_logs": false,
                "sql_secret_pattern_hits": false
            },
            "operator_action": "No-Secret-Smoke ist grün und als öffentliche Go-live-Evidence verwendbar."
        }
    ],
    "crawler_readiness_smoke": {
        "id": "crawler_readiness_smoke",
        "label": "DACH Crawler Readiness Smoke",
        "available": true,
        "url": "https://saferpage.de/evidence/crawler-readiness-smoke.json",
        "status": "ok",
        "ok": true,
        "generated_at": "2026-06-09T21:05:01+00:00",
        "summary": "No-Secret-Smoke fuer DACH-Crawler-Operations, Timer-Runner, User-Agent, Seedquelle, Performance-Grenzen, Recent-Reportlinks und Screenshot-Preview-Coverage.",
        "metrics": {
            "target_count": 10,
            "http_passed_count": 10,
            "http_failed_count": 0,
            "check_count": 12,
            "passed_check_count": 10,
            "warning_check_count": 2,
            "failed_check_count": 0,
            "crawler_available": 1,
            "timer_available": 1,
            "dach_check_count": 702,
            "queue_count": 626,
            "seed_file_host_count": 86,
            "recent_report_count": 36,
            "test_index_visible_count": 200,
            "test_index_total_public_checks": 714,
            "test_index_preview_coverage_percent": 100,
            "test_index_preview_missing_count": 0,
            "test_index_preview_legacy_size_count": 648,
            "test_index_preview_contract_width": 160,
            "test_index_preview_contract_height": 150,
            "test_index_preview_contract_fit": "contain",
            "test_index_preview_contract_source_capture": "full_page",
            "test_index_preview_contract_capture_version": "contain-v3-fullpage-to-160x150",
            "test_index_crawler_german_count": 702,
            "preview_coverage_percent": 100,
            "preview_missing_count": 0,
            "error_rate_percent": 2.95,
            "max_hosts_per_run": 8,
            "concurrency": 2,
            "timeout_seconds": 90,
            "timer_gate_count": 11,
            "timer_passed_gate_count": 11,
            "timer_warning_gate_count": 0,
            "timer_blocked_gate_count": 0,
            "blocked_expected_count": 0
        },
        "no_secret_policy": {
            "contains_secrets": false,
            "contains_private_target_urls": false,
            "contains_recipients": false,
            "contains_private_documents": false,
            "contains_visitor_logs": false,
            "forbidden_pattern_hits": false
        },
        "operator_action": "No-Secret-Smoke ist grün und als öffentliche Go-live-Evidence verwendbar."
    },
    "trust_readiness_smoke": {
        "id": "trust_readiness_smoke",
        "label": "Trust-Readiness Smoke",
        "available": true,
        "url": "https://saferpage.de/evidence/trust-readiness-smoke.json",
        "status": "ok",
        "ok": true,
        "generated_at": "2026-06-09T19:44:29+00:00",
        "summary": "No-Secret-Smoke fuer Trust-Readiness, Gated-Trust-Dossier, Viewer-Datenschutz, Questionnaire-Review, Export-Blueprints, Data-Room-Gates und Public-Evidence-Linkvertrag.",
        "metrics": {
            "target_count": 32,
            "http_passed_count": 32,
            "http_failed_count": 0,
            "check_count": 12,
            "passed_check_count": 11,
            "warning_check_count": 0,
            "failed_check_count": 0,
            "blocked_expected_count": 1,
            "trust_readiness_item_count": 120,
            "public_links_per_domain": 28,
            "public_evidence_link_count": 3360,
            "public_trust_module_count": 28,
            "advanced_trust_module_target_count": 13,
            "advanced_trust_module_passed_count": 13,
            "preview_contract_width": 160,
            "preview_contract_height": 150,
            "preview_contract_fit": "contain",
            "preview_contract_source_capture": "full_page",
            "preview_contract_capture_version": "contain-v3-fullpage-to-160x150",
            "gated_public_trust_coverage_percent": 100,
            "gated_blocked_gate_count": 7,
            "gated_pending_gate_count": 2,
            "questionnaire_review_readiness_score": 100,
            "questionnaire_review_lane_count": 5,
            "questionnaire_approval_gate_count": 6,
            "questionnaire_assignment_group_count": 5,
            "questionnaire_delegation_suggestion_count": 6,
            "questionnaire_notification_digest_available": 1,
            "questionnaire_notification_channel_count": 5,
            "questionnaire_notification_frequency_count": 3,
            "questionnaire_notification_contains_real_recipients": 0
        },
        "no_secret_policy": {
            "contains_secrets": false,
            "contains_private_target_urls": false,
            "contains_recipients": false,
            "contains_private_documents": false,
            "contains_visitor_logs": false,
            "contains_magic_links": false,
            "forbidden_pattern_hits": false
        },
        "operator_action": "No-Secret-Smoke ist grün und als öffentliche Go-live-Evidence verwendbar."
    },
    "competitive_source_availability_smoke": {
        "id": "competitive_source_availability_smoke",
        "label": "Competitive Source Availability Smoke",
        "available": true,
        "url": "https://saferpage.de/evidence/competitive-source-availability-smoke.json",
        "status": "ok",
        "ok": true,
        "generated_at": "2026-06-09T20:04:41+00:00",
        "summary": "Sanitisierter Availability-Smoke fuer offizielle Wettbewerbs-Primärquellen aus dem SaferPage Quellen-Watch.",
        "metrics": {
            "source_count": 14,
            "reachable_count": 12,
            "manual_review_required_count": 2,
            "client_error_review_required_count": 0,
            "server_error_count": 0,
            "transport_failed_count": 0,
            "hard_failure_count": 0,
            "target_count": 14,
            "check_count": 14,
            "failed_check_count": 0,
            "blocked_expected_count": 0
        },
        "no_secret_policy": {
            "contains_secrets": false,
            "contains_private_target_urls": false,
            "contains_recipients": false,
            "contains_private_documents": false,
            "contains_visitor_logs": false
        },
        "operator_action": "No-Secret-Smoke ist grün und als öffentliche Go-live-Evidence verwendbar."
    },
    "alert_delivery_readiness_smoke": {
        "available": true,
        "url": "https://saferpage.de/evidence/alert-delivery-readiness-smoke.json",
        "status": "ok",
        "ok": true,
        "generated_at": "2026-06-09T17:46:10+00:00",
        "summary": "No-Secret-Smoke fuer Alert-Delivery-Preflight, Dispatch-Runner, Runtime-Kontrollen, Delivery-Fixture, Operator-Go-live und isolierten Dry-run.",
        "claim_boundary": "Dieser Smoke setzt keine Delivery-Secrets, konfiguriert keine Zielsysteme, versendet keine Alerts, schreibt keinen produktiven Sink und veröffentlicht keine Webhook-URLs, Tokens, Empfänger oder Rohpayloads.",
        "metrics": {
            "target_count": 6,
            "failed_check_count": 0,
            "blocked_expected_count": 1,
            "dispatch_approved": 0,
            "native_ready_channel_count": 1,
            "dry_run_sent_count": 0,
            "runner_sent_count": 0
        },
        "no_secret_policy": {
            "contains_secrets": false,
            "contains_target_urls": false,
            "contains_recipients": false,
            "contains_raw_payloads": false,
            "contains_private_documents": false,
            "contains_visitor_logs": false,
            "public_export_secret_pattern_hits": false
        },
        "operator_action": "Alert-Delivery-Smoke ist grün: öffentliche Nachweise sind erreichbar, erwartete Produktivblocker sind sichtbar und Dry-run/Runner haben keine Alerts versendet."
    },
    "security_feed_readiness_smoke": {
        "available": true,
        "url": "https://saferpage.de/evidence/security-feed-readiness-smoke.json",
        "status": "ok",
        "ok": true,
        "generated_at": "2026-06-09T19:39:37+00:00",
        "summary": "No-Secret-Smoke fuer Security-Feed-Launch-Board, Credential-Preflight, Storage-Readiness, Runner, Runtime-Kontrollen, Operator-Go-live und isolierten Dry-run.",
        "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.",
        "metrics": {
            "target_count": 12,
            "failed_check_count": 0,
            "blocked_expected_count": 2,
            "missing_required_secret_reference_count": 3,
            "storage_missing_database_artifact_count": 11,
            "dry_run_executed_count": 0,
            "dry_run_stored_observation_count": 0
        },
        "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": false
        },
        "operator_action": "Security-Feed-Smoke ist grün: öffentliche Nachweise sind erreichbar, erwartete Produktivblocker sind sichtbar und der Dry-run hat keine externen Feeds ausgeführt oder Observations gespeichert."
    },
    "api_key_readiness_smoke": {
        "id": "api_key_readiness_smoke",
        "label": "API-Key Readiness Smoke",
        "available": true,
        "url": "https://saferpage.de/evidence/api-key-readiness-smoke.json",
        "status": "ok",
        "ok": true,
        "generated_at": "2026-06-09T19:20:35+00:00",
        "summary": "No-Secret-Smoke fuer API-Key-Readiness, Migration-Preflight, Runtime-Gates und Operator-Go-live-Verknuepfung.",
        "metrics": {
            "target_count": 6,
            "http_passed_count": 6,
            "http_failed_count": 0,
            "check_count": 6,
            "failed_check_count": 0,
            "blocked_expected_count": 1,
            "api_access_storage_table_count": 0,
            "api_access_storage_ready": 0,
            "missing_required_artifact_count": 2,
            "runtime_implementation_passed_count": 7,
            "runtime_implementation_gate_count": 7
        },
        "no_secret_policy": {
            "contains_secrets": false,
            "contains_private_target_urls": false,
            "contains_recipients": false,
            "contains_private_documents": false,
            "contains_visitor_logs": false,
            "sql_secret_pattern_hits": false
        },
        "operator_action": "No-Secret-Smoke ist grün und als öffentliche Go-live-Evidence verwendbar."
    },
    "api_access_migration_preflight": {
        "admin_dsn_required": true,
        "api_access_audit_log_table": false,
        "api_key_store_ready": false,
        "api_keys_table": false,
        "available": true,
        "checks": [
            {
                "id": "api_keys_table",
                "label": "API-Key-Tabelle",
                "operator_action": "infra/postgres/migrations/api-access.sql mit kurzlebigem Admin-DSN aus sicherer Shell anwenden.",
                "purpose": "Speichert nur Prefix, Hash, Scopes, Status, Ablauf und Revocation-Metadaten.",
                "ready": false,
                "required_for_key_store": true,
                "status": "missing"
            },
            {
                "id": "api_access_audit_log_table",
                "label": "API-Access-Auditlog",
                "operator_action": "infra/postgres/migrations/api-access.sql mit kurzlebigem Admin-DSN aus sicherer Shell anwenden.",
                "purpose": "Append-only Auditlog fuer Key-Prefix, Scope, Route, Entscheidung, Status und Hash-Evidence.",
                "ready": false,
                "required_for_key_store": true,
                "status": "missing"
            },
            {
                "id": "scan_results_table",
                "label": "Scan-Results-Basistabelle",
                "operator_action": "Weiter beobachten.",
                "purpose": "Vorhandene Reportbasis fuer Public- und Operator-Read-Flows.",
                "ready": true,
                "required_for_key_store": false,
                "status": "ready"
            }
        ],
        "database_name": "saferpage",
        "database_reachable": true,
        "db_user_redacted": "63a9f0ea7bb98050796b649e85481845",
        "generated_at": "2026-06-09T21:08:54.705882Z",
        "migration_path": "infra/postgres/migrations/api-access.sql",
        "migration_required": true,
        "migration_sha256": "27d802d48887d084e9132c841b943681c70638bd432746a92cab7809be621213",
        "missing_artifact_count": 2,
        "missing_required_artifacts": [
            "api_keys_table",
            "api_access_audit_log_table"
        ],
        "operator_runbook": [
            "Kurzlebigen Admin-DSN nur in einer sicheren Shell setzen; nicht in History, Projektdateien, systemd-Units oder Public-State speichern.",
            "scripts/run-api-access-migration-preflight.sh ausfuehren und missing_required_artifacts pruefen.",
            "scripts/run-api-access-migration.sh mit Admin-DSN ausfuehren.",
            "Preflight erneut ausfuehren, danach API-Key-Pepper, Domain-Claim, Write-HMAC und Deny/Allow-Smokes aktivieren."
        ],
        "public_schema_create_privilege": false,
        "ready_artifact_count": 0,
        "required_artifact_count": 2,
        "safe_apply_command": "SAFERPAGE_MIGRATION_DATABASE_URL='postgresql://admin@localhost/saferpage' scripts/run-api-access-migration.sh",
        "safe_combined_apply_command": "SAFERPAGE_MIGRATION_DATABASE_URL='postgresql://admin@localhost/saferpage' scripts/run-storage-migrations.sh",
        "safe_next_action": "Run the migration from a secure shell with a short-lived admin DSN; do not store or publish the DSN.",
        "safe_preflight_command": "scripts/run-api-access-migration-preflight.sh",
        "scan_results_table": true,
        "schema": "https://saferpage.de/schemas/operator-api-access-migration-preflight.v1",
        "secret_policy": "No DSN, password, raw database user, host, port, key hash or API key is exported.",
        "url": "https://saferpage.de/evidence/api-access-migration-preflight.json"
    },
    "security_feed_storage_preflight": {
        "admin_dsn_required": true,
        "available": true,
        "checks": [
            {
                "id": "security_feed_observations_table",
                "label": "Feed-Observations-Tabelle",
                "operator_action": "infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.",
                "purpose": "Private Malware-/Blacklist-/DAST-Observations mit Hash, Verdict, Review- und Publish-Status.",
                "ready": false,
                "required_for_storage": true,
                "status": "missing"
            },
            {
                "id": "security_feed_alert_links_table",
                "label": "Alert-Link-Tabelle",
                "operator_action": "infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.",
                "purpose": "Verknuepft private Feed-Observations mit Alerts/Tickets ohne Rohpayload-Export.",
                "ready": false,
                "required_for_storage": true,
                "status": "missing"
            },
            {
                "id": "security_feed_audit_log_table",
                "label": "Feed-Auditlog",
                "operator_action": "infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.",
                "purpose": "Append-only Review-, Publish-, Suppress- und Delete-Entscheidungen.",
                "ready": false,
                "required_for_storage": true,
                "status": "missing"
            },
            {
                "id": "security_feed_observations_domain_checked_idx",
                "label": "Domain/Checked-Index",
                "operator_action": "infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.",
                "purpose": "Schneller Zugriff auf letzte Feed-Checks pro Domain.",
                "ready": false,
                "required_for_storage": true,
                "status": "missing"
            },
            {
                "id": "security_feed_observations_source_verdict_idx",
                "label": "Source/Verdict-Index",
                "operator_action": "infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.",
                "purpose": "Auswertung nach Feed-Quelle und Verdict.",
                "ready": false,
                "required_for_storage": true,
                "status": "missing"
            },
            {
                "id": "security_feed_observations_expires_idx",
                "label": "Retention-Index",
                "operator_action": "infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.",
                "purpose": "Loesch- und Ablaufjobs finden faellige Observations.",
                "ready": false,
                "required_for_storage": true,
                "status": "missing"
            },
            {
                "id": "security_feed_observations_result_meta_gin_idx",
                "label": "Result-Meta-GIN-Index",
                "operator_action": "infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.",
                "purpose": "Sanitisierte Metadaten bleiben filterbar.",
                "ready": false,
                "required_for_storage": true,
                "status": "missing"
            },
            {
                "id": "security_feed_alert_links_dedupe_idx",
                "label": "Alert-Dedupe-Index",
                "operator_action": "infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.",
                "purpose": "Verhindert doppelte Alert-Verknuepfungen.",
                "ready": false,
                "required_for_storage": true,
                "status": "missing"
            },
            {
                "id": "security_feed_audit_log_dedupe_idx",
                "label": "Audit-Dedupe-Index",
                "operator_action": "infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.",
                "purpose": "Audit-Events koennen pro Dedupe-Key nachvollzogen werden.",
                "ready": false,
                "required_for_storage": true,
                "status": "missing"
            },
            {
                "id": "security_feed_observations_set_updated_at_trigger",
                "label": "Observations-updated_at-Trigger",
                "operator_action": "infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.",
                "purpose": "Aenderungen setzen updated_at automatisch.",
                "ready": false,
                "required_for_storage": true,
                "status": "missing"
            },
            {
                "id": "security_feed_alert_links_set_updated_at_trigger",
                "label": "Alert-Link-updated_at-Trigger",
                "operator_action": "infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin aus sicherer Shell anwenden.",
                "purpose": "Aenderungen setzen updated_at automatisch.",
                "ready": false,
                "required_for_storage": true,
                "status": "missing"
            }
        ],
        "database_name": "saferpage",
        "database_reachable": true,
        "db_user_redacted": "63a9f0ea7bb98050796b649e85481845",
        "generated_at": "2026-06-09T21:08:54.762740Z",
        "migration_path": "infra/postgres/migrations/security-feed-storage.sql",
        "migration_required": true,
        "migration_sha256": "306a569bdf0d59054861ddc8ddfcf0d09a825f097f3d1dbe88993e481f048314",
        "missing_artifact_count": 11,
        "missing_required_artifacts": [
            "security_feed_observations_table",
            "security_feed_alert_links_table",
            "security_feed_audit_log_table",
            "security_feed_observations_domain_checked_idx",
            "security_feed_observations_source_verdict_idx",
            "security_feed_observations_expires_idx",
            "security_feed_observations_result_meta_gin_idx",
            "security_feed_alert_links_dedupe_idx",
            "security_feed_audit_log_dedupe_idx",
            "security_feed_observations_set_updated_at_trigger",
            "security_feed_alert_links_set_updated_at_trigger"
        ],
        "operator_runbook": [
            "Kurzlebigen Admin-DSN nur in einer sicheren Shell setzen; nicht in History, Projektdateien, systemd-Units oder Public-State speichern.",
            "scripts/run-security-feed-storage-preflight.sh ausfuehren und missing_required_artifacts pruefen.",
            "infra/postgres/migrations/security-feed-storage.sql mit DB-Owner/Admin anwenden oder scripts/run-storage-migrations.sh nutzen.",
            "Preflight erneut ausfuehren, danach Retention/Review freigeben und erst dann SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED setzen.",
            "Storage-Canary ausfuehren, bevor echte externe Feed-Treffer gespeichert werden."
        ],
        "public_schema_create_privilege": false,
        "ready_artifact_count": 0,
        "required_artifact_count": 11,
        "safe_apply_command": "psql -d saferpage -v ON_ERROR_STOP=1 -f infra/postgres/migrations/security-feed-storage.sql",
        "safe_combined_apply_command": "SAFERPAGE_MIGRATION_DATABASE_URL='postgresql://admin@localhost/saferpage' scripts/run-storage-migrations.sh",
        "safe_next_action": "Apply the storage migration from a secure shell with a DB owner/admin role; keep credentials out of project files, public state and logs.",
        "safe_preflight_command": "scripts/run-security-feed-storage-preflight.sh",
        "schema": "https://saferpage.de/schemas/security-feed-storage-preflight.v1",
        "secret_policy": "No DSN, password, raw database user, host, port, feed credential, webhook URL or raw feed payload is exported.",
        "security_feed_alert_links_dedupe_idx": false,
        "security_feed_alert_links_set_updated_at_trigger": false,
        "security_feed_alert_links_table": false,
        "security_feed_audit_log_dedupe_idx": false,
        "security_feed_audit_log_table": false,
        "security_feed_observations_domain_checked_idx": false,
        "security_feed_observations_expires_idx": false,
        "security_feed_observations_result_meta_gin_idx": false,
        "security_feed_observations_set_updated_at_trigger": false,
        "security_feed_observations_source_verdict_idx": false,
        "security_feed_observations_table": false,
        "storage_artifact_ready": false,
        "url": "https://saferpage.de/evidence/security-feed-storage-preflight.json"
    },
    "phases": [
        {
            "id": "delivery_targets_and_approval",
            "label": "Alert-Zustellung freigeben",
            "owner": "IT/Security",
            "status": "waiting_for_secure_inputs",
            "ready": false,
            "current_blocker": "Externes Webhook/Slack/Teams-Ziel fehlt. SAFERPAGE_ALERT_DISPATCH_APPROVED ist nicht aktiv.",
            "required_env_refs": [
                "SAFERPAGE_ALERT_DISPATCH_APPROVED",
                "SAFERPAGE_WEBHOOK_URL",
                "SAFERPAGE_WEBHOOK_SECRET",
                "SAFERPAGE_SLACK_WEBHOOK_URL",
                "SAFERPAGE_TEAMS_WEBHOOK_URL",
                "SAFERPAGE_LOCAL_FILE_SINK_PATH"
            ],
            "evidence_urls": [
                "https://saferpage.de/integrationen/delivery-credential-preflight-json",
                "https://saferpage.de/integrationen/delivery-approval-template.env",
                "https://saferpage.de/alarme/dispatch-runner-json",
                "https://saferpage.de/evidence/delivery-runtime-controls.json",
                "https://saferpage.de/evidence/alert-delivery-readiness-smoke.json"
            ],
            "safe_commands": [
                "scripts/run-alert-delivery-readiness-smoke.sh",
                "scripts/run-alert-dispatch-dry-run-smoke.sh"
            ],
            "acceptance_criteria": [
                "Alert-Delivery-Readiness-Smoke ist gruen: HTTP-Ziele erreichbar, failed_check_count=0, Dry-run sent_count=0 und Runner sent_count=0.",
                "Mindestens ein externes natives Zielsystem ist serverseitig konfiguriert oder der lokale File-Sink ist bewusst nur fuer Audit-Dry-runs zugelassen.",
                "SAFERPAGE_ALERT_DISPATCH_APPROVED=yes ist erst nach dokumentierter Betreiberfreigabe gesetzt.",
                "Receiver prueft Idempotency-Key und optional HMAC-Signatur.",
                "Public-State zeigt keine Ziel-URLs, Tokens, Empfaenger oder Rohpayloads."
            ],
            "stop_conditions": [
                "sent_count steigt ohne Approval-Record.",
                "Webhook-URL, Token oder Empfaenger erscheinen in Public-State, Logs oder Exporten.",
                "Zielsystem erzeugt Duplikate trotz Idempotency-Key.",
                "Runner error_count ist groesser 0."
            ],
            "operator_steps": [
                "Zielsystem-Owner und Testkanal festlegen.",
                "Secrets in /etc/saferpage/alert-dispatch.env oder Secret Manager setzen.",
                "Dry-run ausfuehren und Runner-State pruefen.",
                "Receiver-Signatur und Dedupe pruefen.",
                "Freigabe setzen und nach erstem Lauf sent/error pruefen."
            ],
            "no_secret_policy": "Nur Referenznamen, Status, Hashes, Commands und Evidence-URLs werden exportiert; keine DSN, Passwoerter, API-Keys, Tokens, Ziel-URLs, Empfaenger, Rohpayloads oder Besucherlogs."
        },
        {
            "id": "security_feed_credentials_and_storage",
            "label": "Security-Feeds aktivieren",
            "owner": "IT/Security + Datenschutz",
            "status": "waiting_for_secure_inputs",
            "ready": false,
            "current_blocker": "URLhaus/Safe-Browsing-Credentials fehlen. SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED ist nicht aktiv.",
            "required_env_refs": [
                "SAFERPAGE_URLHAUS_AUTH_KEY",
                "SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY",
                "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED",
                "SAFERPAGE_SECURITY_FEED_PREFLIGHT_APPROVED",
                "SAFERPAGE_WEBHOOK_SECRET",
                "SAFERPAGE_OPERATOR_WEBHOOK_SECRET"
            ],
            "evidence_urls": [
                "https://saferpage.de/sicherheit/feed-credential-preflight-json",
                "https://saferpage.de/sicherheit/feed-activation-template.env",
                "https://saferpage.de/sicherheit/feed-storage-readiness-json",
                "https://saferpage.de/evidence/security-feed-storage-preflight.json",
                "https://saferpage.de/evidence/security-feed-readiness-smoke.json",
                "https://saferpage.de/sicherheit/feed-launch-board-json"
            ],
            "safe_commands": [
                "scripts/run-security-feed-readiness-smoke.sh",
                "scripts/run-security-feed-storage-preflight.sh",
                "scripts/run-storage-migrations.sh",
                "scripts/run-security-feed-dry-run-smoke.sh"
            ],
            "acceptance_criteria": [
                "Security-Feed-Readiness-Smoke ist gruen: HTTP-Ziele erreichbar, failed_check_count=0, Dry-run executed_count=0 und stored_observation_count=0.",
                "Feed-Credentials sind als present=true sichtbar, ohne Secret-Werte auszugeben.",
                "Storage-Artefakte sind migriert und Retention-/Review-Regeln sind freigegeben.",
                "Storage-Canary laeuft vor echten Feed-Treffern erfolgreich.",
                "Live-Probe und Runner-State zeigen keine Feed-Rohpayloads, Malware-Samples oder personenbezogenen Logs."
            ],
            "stop_conditions": [
                "Secret-Wert, API-Key, Rohpayload oder personenbezogene Logzeile erscheint in Public-State.",
                "Externe Feed-Abfrage laeuft ohne explizites Run-Gate.",
                "stored_observation_count steigt vor Storage-Freigabe.",
                "Launch-Board zeigt Runner-Fehler oder unerklaerte externe Ausfuehrungen."
            ],
            "operator_steps": [
                "Feed-Quellen und Zweck freigeben.",
                "Secrets nur serverseitig setzen.",
                "Storage-Migration und Preflight pruefen.",
                "Canary ohne externe Feed-Abfrage ausfuehren.",
                "Erst danach Storage-Approval und optional Live-Probe setzen."
            ],
            "no_secret_policy": "Nur Referenznamen, Status, Hashes, Commands und Evidence-URLs werden exportiert; keine DSN, Passwoerter, API-Keys, Tokens, Ziel-URLs, Empfaenger, Rohpayloads oder Besucherlogs."
        },
        {
            "id": "operator_api_key_readiness",
            "label": "Operator-API-Key-Store freischalten",
            "owner": "IT/Security",
            "status": "waiting_for_secure_inputs",
            "ready": false,
            "current_blocker": "API-Access-Storage 0/2 Tabellen; produktive API-Key-Freigaben 0/7.",
            "required_env_refs": [
                "SAFERPAGE_MIGRATION_DATABASE_URL",
                "SAFERPAGE_API_KEY_STORE_READY",
                "SAFERPAGE_API_SCOPE_ENFORCEMENT_READY",
                "SAFERPAGE_API_ACCESS_AUDIT_READY",
                "SAFERPAGE_API_RATE_LIMIT_READY",
                "SAFERPAGE_API_REVOCATION_READY",
                "SAFERPAGE_API_DOMAIN_CLAIM_READY",
                "SAFERPAGE_API_WRITE_HMAC_READY",
                "SAFERPAGE_API_WRITE_HMAC_SECRET"
            ],
            "evidence_urls": [
                "https://saferpage.de/api-zugriff/key-readiness-json",
                "https://saferpage.de/api-zugriff/access-migration.sql",
                "https://saferpage.de/evidence/api-access-migration-preflight.json",
                "https://saferpage.de/api-zugriff/runtime-gate-probe-json",
                "https://saferpage.de/evidence/api-runtime-controls.json"
            ],
            "safe_commands": [
                "scripts/run-api-access-migration-preflight.sh",
                "scripts/run-storage-migrations.sh",
                "scripts/run-api-runtime-deny-smoke.sh",
                "scripts/run-api-service-smoke.sh"
            ],
            "acceptance_criteria": [
                "api_keys und api_access_audit_log existieren.",
                "Migration wurde mit kurzlebigem Admin-DSN angewendet, ohne DSN oder Passwort zu loggen.",
                "Deny-Smokes erzeugen 401/403/429/Revocation-Evidence ohne Roh-Key-Ausgabe.",
                "Write-HMAC-Test-Fixture ist gegen Client/Receiver verifiziert.",
                "Alle sieben API-Gates sind erst nach Domain-Claim und Test-Key-Abnahme aktiv."
            ],
            "stop_conditions": [
                "DB-User hat kein CREATE-Recht und kein kurzlebiger Admin-DSN ist sicher gesetzt.",
                "Key-Hash, Pepper, Roh-Key oder Authorization-Header erscheint in Exporten.",
                "Write-HMAC oder Domain-Claim fehlen vor produktiver Key-Ausstellung.",
                "API-Gates werden vor erfolgreichem Smoke aktiviert."
            ],
            "operator_steps": [
                "Migration-Preflight pruefen.",
                "Kurzlebigen Admin-DSN nur in sicherer Shell setzen.",
                "Migration anwenden und Preflight erneut pruefen.",
                "Pepper/HMAC-Secret serverseitig setzen.",
                "Domain-Claim, Test-Key, Deny/Allow/Revocation-Smokes abnehmen."
            ],
            "no_secret_policy": "Nur Referenznamen, Status, Hashes, Commands und Evidence-URLs werden exportiert; keine DSN, Passwoerter, API-Keys, Tokens, Ziel-URLs, Empfaenger, Rohpayloads oder Besucherlogs."
        }
    ],
    "operator_approval_queue": [
        {
            "id": "approval_delivery_targets_and_approval",
            "phase_id": "delivery_targets_and_approval",
            "label": "Alert-Zustellung freigeben",
            "status": "waiting_for_operator_inputs",
            "owner": "IT/Security",
            "decision_required": "Sichere Inputs, Betreiberfreigabe und Smoke-Evidence nachreichen.",
            "current_blocker": "Externes Webhook/Slack/Teams-Ziel fehlt. SAFERPAGE_ALERT_DISPATCH_APPROVED ist nicht aktiv.",
            "primary_url": "https://saferpage.de/integrationen/delivery-credential-preflight-json",
            "env_refs_to_set": [
                "SAFERPAGE_ALERT_DISPATCH_APPROVED",
                "SAFERPAGE_WEBHOOK_URL",
                "SAFERPAGE_WEBHOOK_SECRET",
                "SAFERPAGE_SLACK_WEBHOOK_URL",
                "SAFERPAGE_TEAMS_WEBHOOK_URL",
                "SAFERPAGE_LOCAL_FILE_SINK_PATH"
            ],
            "safe_commands": [
                "scripts/run-alert-delivery-readiness-smoke.sh",
                "scripts/run-alert-dispatch-dry-run-smoke.sh"
            ],
            "evidence_urls": [
                "https://saferpage.de/integrationen/delivery-credential-preflight-json",
                "https://saferpage.de/integrationen/delivery-approval-template.env",
                "https://saferpage.de/alarme/dispatch-runner-json",
                "https://saferpage.de/evidence/delivery-runtime-controls.json",
                "https://saferpage.de/evidence/alert-delivery-readiness-smoke.json"
            ],
            "acceptance_criteria": [
                "Alert-Delivery-Readiness-Smoke ist gruen: HTTP-Ziele erreichbar, failed_check_count=0, Dry-run sent_count=0 und Runner sent_count=0.",
                "Mindestens ein externes natives Zielsystem ist serverseitig konfiguriert oder der lokale File-Sink ist bewusst nur fuer Audit-Dry-runs zugelassen.",
                "SAFERPAGE_ALERT_DISPATCH_APPROVED=yes ist erst nach dokumentierter Betreiberfreigabe gesetzt.",
                "Receiver prueft Idempotency-Key und optional HMAC-Signatur.",
                "Public-State zeigt keine Ziel-URLs, Tokens, Empfaenger oder Rohpayloads."
            ],
            "stop_conditions": [
                "sent_count steigt ohne Approval-Record.",
                "Webhook-URL, Token oder Empfaenger erscheinen in Public-State, Logs oder Exporten.",
                "Zielsystem erzeugt Duplikate trotz Idempotency-Key.",
                "Runner error_count ist groesser 0."
            ],
            "operator_steps": [
                "Zielsystem-Owner und Testkanal festlegen.",
                "Secrets in /etc/saferpage/alert-dispatch.env oder Secret Manager setzen.",
                "Dry-run ausfuehren und Runner-State pruefen.",
                "Receiver-Signatur und Dedupe pruefen.",
                "Freigabe setzen und nach erstem Lauf sent/error pruefen."
            ],
            "signoff_record_template": {
                "approver_role": "IT/Security",
                "approved_at": "ISO-8601 timestamp",
                "scope": "delivery_targets_and_approval",
                "evidence_urls": [
                    "https://saferpage.de/integrationen/delivery-credential-preflight-json",
                    "https://saferpage.de/integrationen/delivery-approval-template.env",
                    "https://saferpage.de/alarme/dispatch-runner-json",
                    "https://saferpage.de/evidence/delivery-runtime-controls.json",
                    "https://saferpage.de/evidence/alert-delivery-readiness-smoke.json"
                ],
                "smoke_result_refs": [
                    "scripts/run-alert-delivery-readiness-smoke.sh",
                    "scripts/run-alert-dispatch-dry-run-smoke.sh"
                ],
                "rollback_owner": "IT/Security",
                "expires_or_review_at": "ISO-8601 timestamp"
            },
            "public_export_policy": "Nur Referenznamen, Status, Hashes, Evidence-URLs, Kommandonamen, Abnahmekriterien und Stop-Bedingungen oeffentlich zeigen; keine Secret-Werte, DSN, Ziel-URLs, Empfaenger, Roh-Keys, Authorization-Header, Rohpayloads oder Besucherlogs."
        },
        {
            "id": "approval_security_feed_credentials_and_storage",
            "phase_id": "security_feed_credentials_and_storage",
            "label": "Security-Feeds aktivieren",
            "status": "waiting_for_operator_inputs",
            "owner": "IT/Security + Datenschutz",
            "decision_required": "Sichere Inputs, Betreiberfreigabe und Smoke-Evidence nachreichen.",
            "current_blocker": "URLhaus/Safe-Browsing-Credentials fehlen. SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED ist nicht aktiv.",
            "primary_url": "https://saferpage.de/sicherheit/feed-credential-preflight-json",
            "env_refs_to_set": [
                "SAFERPAGE_URLHAUS_AUTH_KEY",
                "SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY",
                "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED",
                "SAFERPAGE_SECURITY_FEED_PREFLIGHT_APPROVED",
                "SAFERPAGE_WEBHOOK_SECRET",
                "SAFERPAGE_OPERATOR_WEBHOOK_SECRET"
            ],
            "safe_commands": [
                "scripts/run-security-feed-readiness-smoke.sh",
                "scripts/run-security-feed-storage-preflight.sh",
                "scripts/run-storage-migrations.sh",
                "scripts/run-security-feed-dry-run-smoke.sh"
            ],
            "evidence_urls": [
                "https://saferpage.de/sicherheit/feed-credential-preflight-json",
                "https://saferpage.de/sicherheit/feed-activation-template.env",
                "https://saferpage.de/sicherheit/feed-storage-readiness-json",
                "https://saferpage.de/evidence/security-feed-storage-preflight.json",
                "https://saferpage.de/evidence/security-feed-readiness-smoke.json",
                "https://saferpage.de/sicherheit/feed-launch-board-json"
            ],
            "acceptance_criteria": [
                "Security-Feed-Readiness-Smoke ist gruen: HTTP-Ziele erreichbar, failed_check_count=0, Dry-run executed_count=0 und stored_observation_count=0.",
                "Feed-Credentials sind als present=true sichtbar, ohne Secret-Werte auszugeben.",
                "Storage-Artefakte sind migriert und Retention-/Review-Regeln sind freigegeben.",
                "Storage-Canary laeuft vor echten Feed-Treffern erfolgreich.",
                "Live-Probe und Runner-State zeigen keine Feed-Rohpayloads, Malware-Samples oder personenbezogenen Logs."
            ],
            "stop_conditions": [
                "Secret-Wert, API-Key, Rohpayload oder personenbezogene Logzeile erscheint in Public-State.",
                "Externe Feed-Abfrage laeuft ohne explizites Run-Gate.",
                "stored_observation_count steigt vor Storage-Freigabe.",
                "Launch-Board zeigt Runner-Fehler oder unerklaerte externe Ausfuehrungen."
            ],
            "operator_steps": [
                "Feed-Quellen und Zweck freigeben.",
                "Secrets nur serverseitig setzen.",
                "Storage-Migration und Preflight pruefen.",
                "Canary ohne externe Feed-Abfrage ausfuehren.",
                "Erst danach Storage-Approval und optional Live-Probe setzen."
            ],
            "signoff_record_template": {
                "approver_role": "IT/Security + Datenschutz",
                "approved_at": "ISO-8601 timestamp",
                "scope": "security_feed_credentials_and_storage",
                "evidence_urls": [
                    "https://saferpage.de/sicherheit/feed-credential-preflight-json",
                    "https://saferpage.de/sicherheit/feed-activation-template.env",
                    "https://saferpage.de/sicherheit/feed-storage-readiness-json",
                    "https://saferpage.de/evidence/security-feed-storage-preflight.json",
                    "https://saferpage.de/evidence/security-feed-readiness-smoke.json",
                    "https://saferpage.de/sicherheit/feed-launch-board-json"
                ],
                "smoke_result_refs": [
                    "scripts/run-security-feed-readiness-smoke.sh",
                    "scripts/run-security-feed-storage-preflight.sh",
                    "scripts/run-storage-migrations.sh",
                    "scripts/run-security-feed-dry-run-smoke.sh"
                ],
                "rollback_owner": "IT/Security + Datenschutz",
                "expires_or_review_at": "ISO-8601 timestamp"
            },
            "public_export_policy": "Nur Referenznamen, Status, Hashes, Evidence-URLs, Kommandonamen, Abnahmekriterien und Stop-Bedingungen oeffentlich zeigen; keine Secret-Werte, DSN, Ziel-URLs, Empfaenger, Roh-Keys, Authorization-Header, Rohpayloads oder Besucherlogs."
        },
        {
            "id": "approval_operator_api_key_readiness",
            "phase_id": "operator_api_key_readiness",
            "label": "Operator-API-Key-Store freischalten",
            "status": "waiting_for_operator_inputs",
            "owner": "IT/Security",
            "decision_required": "Sichere Inputs, Betreiberfreigabe und Smoke-Evidence nachreichen.",
            "current_blocker": "API-Access-Storage 0/2 Tabellen; produktive API-Key-Freigaben 0/7.",
            "primary_url": "https://saferpage.de/api-zugriff/key-readiness-json",
            "env_refs_to_set": [
                "SAFERPAGE_MIGRATION_DATABASE_URL",
                "SAFERPAGE_API_KEY_STORE_READY",
                "SAFERPAGE_API_SCOPE_ENFORCEMENT_READY",
                "SAFERPAGE_API_ACCESS_AUDIT_READY",
                "SAFERPAGE_API_RATE_LIMIT_READY",
                "SAFERPAGE_API_REVOCATION_READY",
                "SAFERPAGE_API_DOMAIN_CLAIM_READY",
                "SAFERPAGE_API_WRITE_HMAC_READY",
                "SAFERPAGE_API_WRITE_HMAC_SECRET"
            ],
            "safe_commands": [
                "scripts/run-api-access-migration-preflight.sh",
                "scripts/run-storage-migrations.sh",
                "scripts/run-api-runtime-deny-smoke.sh",
                "scripts/run-api-service-smoke.sh"
            ],
            "evidence_urls": [
                "https://saferpage.de/api-zugriff/key-readiness-json",
                "https://saferpage.de/api-zugriff/access-migration.sql",
                "https://saferpage.de/evidence/api-access-migration-preflight.json",
                "https://saferpage.de/api-zugriff/runtime-gate-probe-json",
                "https://saferpage.de/evidence/api-runtime-controls.json"
            ],
            "acceptance_criteria": [
                "api_keys und api_access_audit_log existieren.",
                "Migration wurde mit kurzlebigem Admin-DSN angewendet, ohne DSN oder Passwort zu loggen.",
                "Deny-Smokes erzeugen 401/403/429/Revocation-Evidence ohne Roh-Key-Ausgabe.",
                "Write-HMAC-Test-Fixture ist gegen Client/Receiver verifiziert.",
                "Alle sieben API-Gates sind erst nach Domain-Claim und Test-Key-Abnahme aktiv."
            ],
            "stop_conditions": [
                "DB-User hat kein CREATE-Recht und kein kurzlebiger Admin-DSN ist sicher gesetzt.",
                "Key-Hash, Pepper, Roh-Key oder Authorization-Header erscheint in Exporten.",
                "Write-HMAC oder Domain-Claim fehlen vor produktiver Key-Ausstellung.",
                "API-Gates werden vor erfolgreichem Smoke aktiviert."
            ],
            "operator_steps": [
                "Migration-Preflight pruefen.",
                "Kurzlebigen Admin-DSN nur in sicherer Shell setzen.",
                "Migration anwenden und Preflight erneut pruefen.",
                "Pepper/HMAC-Secret serverseitig setzen.",
                "Domain-Claim, Test-Key, Deny/Allow/Revocation-Smokes abnehmen."
            ],
            "signoff_record_template": {
                "approver_role": "IT/Security",
                "approved_at": "ISO-8601 timestamp",
                "scope": "operator_api_key_readiness",
                "evidence_urls": [
                    "https://saferpage.de/api-zugriff/key-readiness-json",
                    "https://saferpage.de/api-zugriff/access-migration.sql",
                    "https://saferpage.de/evidence/api-access-migration-preflight.json",
                    "https://saferpage.de/api-zugriff/runtime-gate-probe-json",
                    "https://saferpage.de/evidence/api-runtime-controls.json"
                ],
                "smoke_result_refs": [
                    "scripts/run-api-access-migration-preflight.sh",
                    "scripts/run-storage-migrations.sh",
                    "scripts/run-api-runtime-deny-smoke.sh",
                    "scripts/run-api-service-smoke.sh"
                ],
                "rollback_owner": "IT/Security",
                "expires_or_review_at": "ISO-8601 timestamp"
            },
            "public_export_policy": "Nur Referenznamen, Status, Hashes, Evidence-URLs, Kommandonamen, Abnahmekriterien und Stop-Bedingungen oeffentlich zeigen; keine Secret-Werte, DSN, Ziel-URLs, Empfaenger, Roh-Keys, Authorization-Header, Rohpayloads oder Besucherlogs."
        }
    ],
    "required_env_refs": [
        "SAFERPAGE_ALERT_DISPATCH_APPROVED",
        "SAFERPAGE_WEBHOOK_URL",
        "SAFERPAGE_WEBHOOK_SECRET",
        "SAFERPAGE_SLACK_WEBHOOK_URL",
        "SAFERPAGE_TEAMS_WEBHOOK_URL",
        "SAFERPAGE_LOCAL_FILE_SINK_PATH",
        "SAFERPAGE_URLHAUS_AUTH_KEY",
        "SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY",
        "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED",
        "SAFERPAGE_SECURITY_FEED_PREFLIGHT_APPROVED",
        "SAFERPAGE_OPERATOR_WEBHOOK_SECRET",
        "SAFERPAGE_MIGRATION_DATABASE_URL",
        "SAFERPAGE_API_KEY_STORE_READY",
        "SAFERPAGE_API_SCOPE_ENFORCEMENT_READY",
        "SAFERPAGE_API_ACCESS_AUDIT_READY",
        "SAFERPAGE_API_RATE_LIMIT_READY",
        "SAFERPAGE_API_REVOCATION_READY",
        "SAFERPAGE_API_DOMAIN_CLAIM_READY",
        "SAFERPAGE_API_WRITE_HMAC_READY",
        "SAFERPAGE_API_WRITE_HMAC_SECRET"
    ],
    "safe_commands": [
        "scripts/run-alert-delivery-readiness-smoke.sh",
        "scripts/run-alert-dispatch-dry-run-smoke.sh",
        "scripts/run-security-feed-readiness-smoke.sh",
        "scripts/run-security-feed-storage-preflight.sh",
        "scripts/run-storage-migrations.sh",
        "scripts/run-security-feed-dry-run-smoke.sh",
        "scripts/run-api-access-migration-preflight.sh",
        "scripts/run-api-runtime-deny-smoke.sh",
        "scripts/run-api-service-smoke.sh"
    ],
    "evidence_urls": [
        "https://saferpage.de/integrationen/delivery-credential-preflight-json",
        "https://saferpage.de/integrationen/delivery-approval-template.env",
        "https://saferpage.de/alarme/dispatch-runner-json",
        "https://saferpage.de/evidence/delivery-runtime-controls.json",
        "https://saferpage.de/evidence/alert-delivery-readiness-smoke.json",
        "https://saferpage.de/sicherheit/feed-credential-preflight-json",
        "https://saferpage.de/sicherheit/feed-activation-template.env",
        "https://saferpage.de/sicherheit/feed-storage-readiness-json",
        "https://saferpage.de/evidence/security-feed-storage-preflight.json",
        "https://saferpage.de/evidence/security-feed-readiness-smoke.json",
        "https://saferpage.de/sicherheit/feed-launch-board-json",
        "https://saferpage.de/api-zugriff/key-readiness-json",
        "https://saferpage.de/api-zugriff/access-migration.sql",
        "https://saferpage.de/evidence/api-access-migration-preflight.json",
        "https://saferpage.de/api-zugriff/runtime-gate-probe-json",
        "https://saferpage.de/evidence/api-runtime-controls.json"
    ],
    "links": {
        "html": "https://saferpage.de/betreiber/go-live",
        "json": "https://saferpage.de/betreiber/go-live-json",
        "csv": "https://saferpage.de/betreiber/go-live-csv",
        "markdown": "https://saferpage.de/betreiber/go-live-md",
        "parity_readiness": "https://saferpage.de/vergleich/parity-readiness-json",
        "evidence_hub": "https://saferpage.de/evidence-hub-json",
        "crawler_readiness_smoke": "https://saferpage.de/evidence/crawler-readiness-smoke.json",
        "trust_readiness_smoke": "https://saferpage.de/evidence/trust-readiness-smoke.json",
        "competitive_source_availability_smoke": "https://saferpage.de/evidence/competitive-source-availability-smoke.json",
        "evidence_health": "https://saferpage.de/vergleich/evidence-health-json",
        "evidence_health_smoke": "https://saferpage.de/evidence/competitive-evidence-health-smoke.json",
        "delivery_preflight": "https://saferpage.de/integrationen/delivery-credential-preflight-json",
        "delivery_approval_template": "https://saferpage.de/integrationen/delivery-approval-template.env",
        "alert_delivery_readiness_smoke": "https://saferpage.de/evidence/alert-delivery-readiness-smoke.json",
        "security_feed_preflight": "https://saferpage.de/sicherheit/feed-credential-preflight-json",
        "security_feed_activation_template": "https://saferpage.de/sicherheit/feed-activation-template.env",
        "security_feed_readiness_smoke": "https://saferpage.de/evidence/security-feed-readiness-smoke.json",
        "api_key_readiness": "https://saferpage.de/api-zugriff/key-readiness-json",
        "api_key_readiness_smoke": "https://saferpage.de/evidence/api-key-readiness-smoke.json",
        "api_access_migration_sql": "https://saferpage.de/api-zugriff/access-migration.sql"
    },
    "disclaimer": "Dieses Command Center aktiviert nichts, erzeugt keine Credentials, ruft keine externen Feeds auf, sendet keine Alerts und veroeffentlicht keine Secret-Werte, Ziel-URLs, Empfaenger, Rohpayloads oder Besucherlogs."
}
