{
    "schema": "https://saferpage.de/schemas/operator-go-live-command-center.v1",
    "generated_at": "2026-08-03T22:43:35+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": 10,
        "evidence_url_count": 16,
        "no_secret_smoke_count": 7,
        "no_secret_smoke_ok_count": 7,
        "no_secret_smoke_target_count": 208,
        "no_secret_smoke_failed_check_count": 0,
        "no_secret_smoke_blocked_expected_count": 4,
        "crawler_readiness_smoke_available": 1,
        "crawler_readiness_smoke_ok": 1,
        "crawler_readiness_smoke_target_count": 11,
        "crawler_readiness_smoke_failed_check_count": 0,
        "trust_readiness_smoke_available": 1,
        "trust_readiness_smoke_ok": 1,
        "trust_readiness_smoke_target_count": 44,
        "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": 35,
        "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": 9,
        "api_key_readiness_smoke_failed_check_count": 0,
        "delivery_runtime_control_count": 8,
        "alert_runner_available": 1,
        "alert_outbox_count": 0,
        "alert_sent_count": 0,
        "alert_error_count": 50,
        "alert_delivery_readiness_smoke_available": 1,
        "alert_delivery_readiness_smoke_ok": 1,
        "alert_delivery_readiness_smoke_target_count": 7,
        "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": 50,
        "security_feed_readiness_smoke_available": 1,
        "security_feed_readiness_smoke_ok": 1,
        "security_feed_readiness_smoke_target_count": 17,
        "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": 0,
        "security_feed_storage_preflight_admin_dsn_required": 0,
        "security_feed_storage_preflight_missing_artifact_count": 11,
        "api_runtime_control_count": 8,
        "api_access_storage_table_count": 2,
        "api_gate_passed_count": 0,
        "api_access_preflight_available": 1,
        "api_access_preflight_database_reachable": 0,
        "api_access_preflight_admin_dsn_required": 0,
        "api_access_preflight_missing_artifact_count": 2,
        "operator_approval_queue_count": 3,
        "operator_approval_waiting_count": 3,
        "operator_signoff_dossier_count": 3,
        "operator_signoff_waiting_count": 3,
        "operator_signoff_evidence_url_count": 16,
        "operator_signoff_safe_command_count": 11,
        "operator_signoff_env_ref_count": 21,
        "operator_signoff_acceptance_criterion_count": 15,
        "operator_signoff_stop_condition_count": 12,
        "operator_signoff_no_secret_check_count": 15,
        "operator_activation_packet_count": 3,
        "operator_activation_packet_waiting_count": 3,
        "operator_activation_packet_phase_count": 18,
        "operator_claim_release_count": 4,
        "operator_claim_release_public_ready_count": 1,
        "operator_claim_release_blocked_live_count": 3,
        "operator_claim_release_review_count": 0,
        "operator_claim_release_operator_input_count": 4,
        "operator_claim_release_evidence_url_count": 4,
        "operator_claim_release_do_not_claim_count": 4,
        "operator_claim_release_boundary_count": 4,
        "operator_claim_release_stop_condition_count": 15,
        "operator_claim_review_lane_count": 3,
        "operator_claim_review_ready_count": 3,
        "operator_claim_review_evidence_url_count": 17,
        "operator_claim_review_acceptance_criterion_count": 15,
        "operator_claim_review_stop_condition_count": 12,
        "operator_claim_review_no_secret_count": 12,
        "operator_signoff_receipt_count": 3,
        "operator_signoff_receipt_waiting_count": 3,
        "operator_signoff_receipt_private_input_ref_count": 21,
        "operator_signoff_receipt_public_field_count": 33,
        "operator_signoff_receipt_public_evidence_url_count": 17,
        "operator_signoff_receipt_safe_command_ref_count": 11,
        "operator_signoff_receipt_verification_check_count": 24,
        "operator_signoff_receipt_no_secret_attestation_count": 33,
        "operator_signoff_receipt_activation_condition_count": 12,
        "operator_signoff_receipt_stop_condition_count": 12,
        "operator_signoff_receipt_claim_boundary_count": 3,
        "operator_activation_evidence_map_row_count": 3,
        "operator_activation_evidence_map_waiting_count": 3,
        "operator_activation_evidence_map_runtime_manifest_count": 3,
        "operator_activation_evidence_map_runtime_manifest_ok_count": 3,
        "operator_activation_evidence_map_runtime_control_count": 23,
        "operator_activation_evidence_map_runtime_enabled_control_count": 23,
        "operator_activation_evidence_map_runtime_missing_control_count": 0,
        "operator_activation_evidence_map_signoff_dossier_count": 3,
        "operator_activation_evidence_map_safe_env_ref_count": 21,
        "operator_activation_evidence_map_safe_command_count": 11,
        "operator_activation_evidence_map_evidence_url_count": 16,
        "operator_activation_evidence_map_acceptance_criterion_count": 15,
        "operator_activation_evidence_map_stop_condition_count": 12,
        "operator_activation_evidence_map_no_secret_check_count": 15,
        "operator_activation_evidence_map_rollback_owner_required_count": 3,
        "operator_activation_evidence_map_rows_complete": 1,
        "competitive_evidence_health_available": 1,
        "competitive_evidence_health_ok": 1,
        "competitive_evidence_health_target_count": 85,
        "competitive_evidence_health_passed_count": 85,
        "competitive_evidence_health_failed_count": 0,
        "competitive_evidence_health_http_failed_count": 0,
        "competitive_evidence_health_contract_check_count": 309,
        "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": 14,
        "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,
        "operator_decision_summary_count": 5,
        "operator_decision_summary_blocked_count": 1,
        "operator_decision_summary_waiting_count": 1
    },
    "activation_sequence": [
        "Öffentliche Evidence zuerst prüfen und unverändert archivieren; Evidence-Health muss vor Produktivfreigabe grün sein.",
        "Secrets, Ziel-URLs und DSN ausschließlich im Server-Environment oder Secret Manager setzen.",
        "Dry-runs und Preflights ausführen, bevor ein Go-live-Gate aktiviert wird.",
        "Betreiberfreigabe mit Scope, Verantwortlichkeit, Smoke-Referenzen, Ablaufdatum und Rollback-Verantwortlichkeit dokumentieren.",
        "Nach jeder Freigabe Live-JSON, Runner-State, Sitemap und Parity-Board erneut prüfen."
    ],
    "competitive_evidence_health": {
        "available": true,
        "url": "https://saferpage.de/evidence/competitive-evidence-health-smoke.json",
        "status": "ok",
        "ok": true,
        "generated_at": "2026-06-15T03:43:49+00:00",
        "summary": "Sanitisierter Smoke-Lauf für die öffentlichen SaferPage-Wettbewerbs-Evidence-Routen und Benchmark-Linkverträge.",
        "source_health_url": "https://saferpage.de/vergleich/evidence-health-json",
        "metrics": {
            "target_count": 85,
            "passed_count": 85,
            "failed_count": 0,
            "http_failed_count": 0,
            "contract_check_count": 309,
            "contract_failed_count": 0,
            "open_benchmark_count": 2,
            "open_action_count": 2,
            "open_public_evidence_url_count": 4,
            "open_runbook_link_count": 14,
            "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-14T00:15:40+00:00",
            "summary": "No-Secret-Smoke für DACH-Crawler-Operations, Timer-Runner, User-Agent, Seedquelle, Performance-Grenzen, Recent-Reportlinks, Public-Test-Index-Qualitätskontrollen und Screenshot-Preview-Coverage.",
            "metrics": {
                "target_count": 11,
                "http_passed_count": 11,
                "http_failed_count": 0,
                "target_duration_measured_count": 11,
                "target_duration_max_ms": 2416,
                "target_duration_p95_ms": 2416,
                "target_duration_budget_ms": 8000,
                "target_duration_slow_count": 0,
                "check_count": 19,
                "passed_check_count": 19,
                "warning_check_count": 0,
                "failed_check_count": 0,
                "crawler_available": 1,
                "timer_available": 1,
                "dach_check_count": 1249,
                "queue_count": 1078,
                "seed_file_host_count": 86,
                "recent_report_count": 36,
                "test_index_visible_count": 200,
                "test_index_total_public_checks": 1433,
                "test_index_preview_coverage_percent": 99.9,
                "test_index_preview_missing_count": 2,
                "test_index_preview_actionable_missing_count": 0,
                "test_index_preview_unreachable_missing_count": 2,
                "test_index_preview_renderer_failed_missing_count": 2,
                "test_index_preview_legacy_size_count": 0,
                "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-v4-viewport-transparency-160x150",
                "test_index_canonical_short_url_count": 200,
                "test_index_direct_report_link_count": 200,
                "test_index_preview_ready_item_count": 199,
                "test_index_preview_contract_item_count": 200,
                "test_index_hash_report_link_count": 0,
                "test_index_php_report_link_count": 0,
                "test_index_crawler_german_count": 1249,
                "test_index_quality_control_count": 11,
                "test_index_quality_control_failed_count": 0,
                "test_index_quality_control_warning_count": 0,
                "test_index_quality_boundary_count": 11,
                "test_index_quality_direct_link_count": 200,
                "test_index_quality_preview_contract_count": 200,
                "test_index_quality_operator_link_count": 200,
                "test_index_quality_discovery_link_count": 25,
                "test_index_discovery_manifest_available": 1,
                "test_index_discovery_manifest_linked_check_count": 1433,
                "test_index_discovery_manifest_letter_url_count": 25,
                "test_index_discovery_manifest_letter_page_url_count": 26,
                "test_index_discovery_manifest_test_sitemap_url_count": 26,
                "test_index_discovery_manifest_latest_page_count": 8,
                "test_index_discovery_manifest_latest_page_url_count": 8,
                "test_index_discovery_manifest_export_format_count": 4,
                "test_index_public_summary_raw_hard_warning_count": 199,
                "test_index_public_summary_hard_warning_count": 0,
                "test_index_public_summary_reframed_count": 200,
                "test_index_public_summary_signal_wording_count": 200,
                "preview_coverage_percent": 99.9,
                "preview_missing_count": 2,
                "preview_actionable_missing_count": 0,
                "preview_unreachable_missing_count": 2,
                "preview_renderer_failed_missing_count": 2,
                "error_rate_percent": 2.05,
                "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,
                "preview_backfill_target_count": 0,
                "preview_backfill_processed_count": 0,
                "preview_backfill_ok_count": 0,
                "preview_backfill_skipped_count": 0,
                "preview_backfill_failed_count": 0,
                "preview_backfill_remaining_estimate": 0,
                "preview_backfill_max_per_run": 24,
                "preview_backfill_concurrency": 2,
                "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-15T03:42:09+00:00",
            "summary": "No-Secret-Smoke für Trust-Readiness, Gated-Trust-Dossier, Viewer-Datenschutz, Questionnaire-Review, Export-Blueprints, Data-Room-Gates und Public-Evidence-Linkvertrag.",
            "metrics": {
                "target_count": 44,
                "http_passed_count": 44,
                "http_failed_count": 0,
                "check_count": 26,
                "passed_check_count": 25,
                "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": 18,
                "advanced_trust_module_passed_count": 18,
                "preview_contract_width": 160,
                "preview_contract_height": 150,
                "preview_contract_fit": "contain",
                "preview_contract_source_capture": "full_page",
                "preview_contract_capture_version": "contain-v4-viewport-transparency-160x150",
                "gated_public_trust_coverage_percent": 100,
                "gated_blocked_gate_count": 7,
                "gated_pending_gate_count": 2,
                "gated_private_beta_launch_kit_item_count": 6,
                "gated_access_journey_dry_run_step_count": 6,
                "gated_legal_nda_signoff_item_count": 5,
                "gated_document_release_receipt_item_count": 5,
                "gated_viewer_cleanup_drill_step_count": 5,
                "gated_questionnaire_intake_pilot_item_count": 6,
                "gated_parity_claim_lane_count": 5,
                "gated_parity_claim_public_ready_count": 1,
                "gated_parity_claim_gated_readiness_count": 2,
                "gated_parity_claim_blocked_live_count": 2,
                "gated_parity_claim_operator_input_count": 5,
                "gated_parity_claim_do_not_claim_count": 5,
                "gated_parity_claim_acceptance_criterion_count": 15,
                "gated_parity_claim_evidence_url_count": 16,
                "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,
                "questionnaire_operations_digest_public_route_count": 13,
                "questionnaire_operations_digest_workflow_step_count": 7,
                "questionnaire_operations_digest_readiness_gate_count": 6,
                "questionnaire_operations_digest_blocked_gate_count": 4,
                "questionnaire_operations_digest_operator_action_count": 5,
                "questionnaire_operations_digest_answer_quality_control_count": 5,
                "questionnaire_operations_digest_private_access_handoff_count": 5,
                "questionnaire_operations_digest_audit_manifest_count": 4,
                "questionnaire_operations_digest_go_live_acceptance_criterion_count": 5,
                "questionnaire_operations_digest_pilot_activation_step_count": 6,
                "questionnaire_operations_digest_dry_run_fixture_count": 4,
                "questionnaire_operations_digest_rollback_drill_step_count": 5,
                "questionnaire_operations_digest_consolidation_status_count": 6,
                "questionnaire_operations_digest_claim_boundary_count": 6,
                "questionnaire_operations_digest_parity_closure_plan_count": 6,
                "questionnaire_operations_digest_parity_closure_done_count": 0,
                "questionnaire_operations_digest_parity_closure_waiting_count": 6,
                "questionnaire_operations_digest_parity_closure_unlock_count": 18,
                "questionnaire_operations_digest_parity_closure_acceptance_criterion_count": 18,
                "questionnaire_operations_digest_parity_closure_boundary_count": 6,
                "questionnaire_operations_digest_parity_closure_evidence_url_count": 6,
                "questionnaire_pilot_signoff_receipt_private_input_count": 9,
                "questionnaire_pilot_signoff_receipt_public_field_count": 10,
                "questionnaire_pilot_signoff_receipt_evidence_url_count": 8,
                "questionnaire_pilot_signoff_receipt_public_evidence_url_count": 8,
                "questionnaire_pilot_signoff_receipt_verification_check_count": 7,
                "questionnaire_pilot_signoff_receipt_no_secret_attestation_count": 7,
                "questionnaire_pilot_signoff_receipt_activation_condition_count": 5,
                "questionnaire_pilot_signoff_receipt_stop_condition_count": 6,
                "trust_questionnaire_drill_evidence_pack_row_count": 6,
                "trust_questionnaire_drill_evidence_pack_passed_count": 4,
                "trust_questionnaire_drill_evidence_pack_blocked_expected_count": 2,
                "trust_questionnaire_drill_evidence_pack_evidence_url_count": 6,
                "trust_questionnaire_drill_evidence_pack_no_secret_boundary_count": 6,
                "trust_questionnaire_drill_evidence_pack_operator_input_count": 6,
                "trust_questionnaire_drill_evidence_pack_acceptance_criterion_count": 18,
                "trust_questionnaire_drill_evidence_pack_stop_condition_count": 18,
                "trust_ai_answer_assistant_sample_count": 7,
                "trust_ai_answer_assistant_review_required_count": 5,
                "trust_ai_answer_assistant_refusal_rule_count": 2,
                "trust_ai_answer_assistant_source_count": 6,
                "trust_ai_answer_assistant_policy_count": 6,
                "trust_ai_answer_assistant_average_confidence": 70,
                "trust_ai_answer_assistant_forbidden_public_field_count": 8,
                "trust_ai_answer_assistant_allowed_public_field_count": 6,
                "trust_ai_answer_assistant_public_route_count": 21,
                "trust_ai_answer_assistant_samples_complete": 1,
                "trust_ai_answer_citation_count": 15,
                "trust_ai_answer_citation_answer_count": 7,
                "trust_ai_answer_citation_review_required_count": 11,
                "trust_ai_answer_citation_reusable_past_answer_count": 2,
                "trust_ai_answer_citation_source_registry_count": 6,
                "trust_ai_answer_citation_approval_gate_count": 4,
                "trust_ai_answer_citation_public_route_count": 7,
                "trust_ai_answer_citations_complete": 1,
                "trust_past_answers_source_type_count": 5,
                "trust_past_answers_reuse_control_count": 5,
                "trust_past_answers_sanitization_queue_count": 5,
                "trust_past_answers_required_sanitization_count": 4,
                "trust_past_answers_enforced_sanitization_count": 1,
                "trust_past_answers_import_workflow_count": 4,
                "trust_past_answers_quality_signal_count": 5,
                "trust_past_answers_guardrail_count": 6,
                "trust_past_answers_enforced_guardrail_count": 3,
                "trust_past_answers_required_guardrail_count": 3,
                "trust_past_answers_non_reusable_source_count": 1,
                "trust_past_answers_public_route_count": 12,
                "trust_past_answers_required_before_live_count": 6,
                "trust_past_answers_readiness_score": 100,
                "trust_past_answers_sanitization_rows_complete": 1,
                "trust_past_answers_guardrail_rows_complete": 1,
                "questionnaire_localization_public_route_count": 10,
                "questionnaire_localization_language_workflow_count": 5,
                "questionnaire_localization_translation_gate_count": 7,
                "questionnaire_localization_blocked_gate_count": 1,
                "questionnaire_localization_export_rule_count": 4,
                "questionnaire_localization_operator_action_count": 4,
                "trust_portal_automation_portal_mode_count": 5,
                "trust_portal_automation_workflow_step_count": 6,
                "trust_portal_automation_extension_control_count": 5,
                "trust_portal_automation_review_queue_count": 5,
                "trust_portal_automation_payload_rule_count": 4,
                "trust_portal_automation_guardrail_count": 6,
                "trust_portal_automation_readiness_score": 100,
                "trust_communications_delivery_channel_count": 8,
                "trust_communications_ready_channel_count": 3,
                "trust_communications_review_channel_count": 5,
                "trust_communications_send_from_gate_count": 4,
                "trust_communications_notification_rule_count": 5,
                "trust_communications_workflow_step_count": 6,
                "trust_communications_audit_control_count": 5,
                "trust_communications_delivery_score": 100,
                "trust_updates_update_count": 8,
                "trust_updates_notify_candidate_count": 7,
                "trust_updates_high_priority_count": 2,
                "trust_updates_subscriber_segment_count": 3,
                "trust_updates_delivery_channel_count": 4,
                "trust_status_surface_count": 6,
                "trust_status_event_type_count": 6,
                "trust_status_publish_gate_count": 6,
                "trust_status_message_template_count": 5,
                "trust_status_channel_count": 5,
                "trust_status_guardrail_count": 6,
                "trust_status_readiness_score": 100,
                "viewer_record_class_count": 6,
                "viewer_connected_system_count": 5,
                "viewer_deletion_workflow_step_count": 6,
                "viewer_access_request_journey_step_count": 6,
                "viewer_self_service_control_count": 5,
                "viewer_access_decision_matrix_count": 4,
                "viewer_abuse_control_count": 5,
                "viewer_evidence_receipt_count": 4
            },
            "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-13T22:34:12+00:00",
            "summary": "Sanitisierter Availability- und Metadata-Smoke für offizielle Wettbewerbs-Primärquellen aus dem SaferPage Quellen-Watch.",
            "metrics": {
                "source_count": 35,
                "reachable_count": 32,
                "manual_review_required_count": 3,
                "client_error_review_required_count": 0,
                "server_error_count": 0,
                "transport_failed_count": 0,
                "hard_failure_count": 0,
                "check_count": 5,
                "failed_check_count": 0,
                "source_watch_source_count": 35,
                "source_watch_official_url_count": 35,
                "source_watch_checked_at_count": 35,
                "source_watch_freshness_status_count": 35,
                "source_watch_next_review_count": 35,
                "source_watch_stale_at_count": 35,
                "source_watch_evidence_summary_count": 35,
                "source_watch_saferpage_implication_count": 35,
                "source_watch_feature_mapping_count": 35,
                "source_watch_review_queue_count": 35,
                "source_watch_review_queue_source_id_count": 35,
                "source_watch_review_queue_status_count": 35,
                "source_watch_review_queue_state_count": 35,
                "source_watch_review_queue_priority_count": 35,
                "source_watch_review_queue_next_review_count": 35,
                "source_watch_review_queue_boundary_count": 35,
                "source_watch_review_queue_watch_url_count": 35,
                "source_watch_review_queue_decision_count": 35,
                "source_watch_freshness_current_count": 35,
                "source_watch_freshness_due_soon_count": 0,
                "source_watch_freshness_due_count": 0,
                "source_watch_freshness_stale_count": 0,
                "source_watch_freshness_unknown_count": 0,
                "source_watch_max_age_days": 2,
                "source_watch_oldest_checked_at_present": 1,
                "manual_review_dossier_count": 3,
                "manual_review_dossier_step_count": 18,
                "manual_review_dossier_acceptance_count": 15,
                "manual_review_dossier_evidence_url_count": 9,
                "manual_review_dossier_fallback_url_count": 9,
                "manual_review_dossier_fallback_complete_count": 3,
                "manual_review_dossier_boundary_count": 3,
                "target_count": 35,
                "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-15T03:43:49+00:00",
            "summary": "Sanitisierter Smoke-Lauf für die öffentlichen SaferPage-Wettbewerbs-Evidence-Routen und Benchmark-Linkverträge.",
            "metrics": {
                "target_count": 85,
                "passed_count": 85,
                "failed_count": 0,
                "http_failed_count": 0,
                "contract_check_count": 309,
                "contract_failed_count": 0,
                "open_benchmark_count": 2,
                "open_action_count": 2,
                "open_public_evidence_url_count": 4,
                "open_runbook_link_count": 14,
                "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": 309,
                "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-15T01:11:38+00:00",
            "summary": "No-Secret-Smoke für Alert-Delivery-Preflight, Dispatch-Runner, Runtime-Kontrollen, Delivery-Fixture, Operator-Go-live und isolierten Dry-run.",
            "metrics": {
                "target_count": 7,
                "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-15T00:27:44+00:00",
            "summary": "No-Secret-Smoke für Security-Feed-Launch-Board, Credential-Preflight, Storage-Readiness, Runner, Runtime-Kontrollen, Operator-Go-live und isolierten Dry-run.",
            "metrics": {
                "target_count": 17,
                "failed_check_count": 0,
                "blocked_expected_count": 2,
                "missing_required_secret_reference_count": 3,
                "storage_missing_database_artifact_count": 0,
                "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-15T00:27:41+00:00",
            "summary": "No-Secret-Smoke für API-Key-Readiness, Migration-Preflight, Runtime-Gates und Operator-Go-live-Verknuepfung.",
            "metrics": {
                "target_count": 9,
                "http_passed_count": 9,
                "http_failed_count": 0,
                "check_count": 21,
                "failed_check_count": 0,
                "blocked_expected_count": 0,
                "api_access_storage_table_count": 2,
                "api_access_storage_ready": 1,
                "missing_required_artifact_count": 0,
                "api_access_preflight_required_artifact_count": 2,
                "api_access_preflight_ready_artifact_count": 2,
                "api_access_preflight_missing_artifact_count": 0,
                "api_access_preflight_admin_dsn_required": 0,
                "api_runtime_public_route_count": 4,
                "api_runtime_protected_route_count": 7,
                "api_runtime_denied_fixture_count": 4,
                "api_runtime_live_denied_fixture_count": 0,
                "api_runtime_write_hmac_fixture_count": 1,
                "api_runtime_write_hmac_negative_test_count": 4,
                "api_runtime_systemd_service_contract": 1,
                "api_runtime_fallback_audit_events_24h": 0,
                "api_runtime_deny_smoke_ok": 1,
                "api_runtime_deny_smoke_status_code": 401,
                "api_runtime_controls_ok": 1,
                "api_runtime_controls_control_count": 8,
                "api_runtime_controls_enabled_control_count": 8,
                "api_runtime_controls_missing_control_count": 0,
                "api_runtime_controls_secret_value_count": 0,
                "api_runtime_controls_no_secret_policy_ok": 1,
                "api_developer_quickstart_count": 4,
                "api_error_contract_count": 6,
                "api_rotation_playbook_step_count": 5,
                "api_client_acceptance_criterion_count": 6,
                "api_issuance_receipt_item_count": 6,
                "api_rate_limit_tier_count": 5,
                "api_abuse_response_step_count": 5,
                "api_post_issuance_watch_signal_count": 5,
                "api_openapi_contract_item_count": 6,
                "api_postman_collection_request_count": 5,
                "api_sdk_readiness_language_count": 5,
                "api_sandbox_onboarding_step_count": 6,
                "api_webhook_receiver_acceptance_count": 5,
                "api_support_slo_tier_count": 4,
                "api_access_page_developer_launch_kit_visible": 1,
                "api_access_openapi_export_ready": 1,
                "api_access_openapi_path_count": 6,
                "api_access_openapi_bearer_auth": 1,
                "api_access_openapi_no_secret_policy_ok": 1,
                "api_access_postman_collection_ready": 1,
                "api_access_postman_request_count": 7,
                "api_access_postman_bearer_placeholder": 1,
                "api_access_postman_no_secret_policy_ok": 1,
                "api_access_postman_forbidden_secret_hit_count": 0,
                "api_consolidation_status_count": 4,
                "api_claim_boundary_count": 4,
                "api_parity_closure_plan_count": 6,
                "api_parity_closure_done_count": 0,
                "api_parity_closure_waiting_count": 6,
                "api_parity_closure_unlock_count": 18,
                "api_parity_closure_acceptance_count": 18,
                "api_parity_closure_operator_input_count": 18,
                "api_parity_closure_boundary_count": 6,
                "api_parity_closure_evidence_url_count": 6,
                "api_migration_signoff_item_count": 5,
                "api_migration_rollback_rehearsal_step_count": 4,
                "api_post_migration_canary_step_count": 6,
                "api_db_owner_handoff_step_count": 5,
                "api_db_owner_handoff_private_input_count": 5,
                "api_db_owner_handoff_public_output_count": 6,
                "api_db_owner_handoff_forbidden_output_count": 8,
                "api_db_owner_handoff_acceptance_count": 6,
                "api_db_owner_handoff_evidence_url_count": 6,
                "api_db_owner_handoff_validation_query_count": 5,
                "api_db_owner_handoff_safe_command_count": 4,
                "operator_go_live_activation_packet_count": 3,
                "operator_go_live_api_activation_step_count": 6,
                "operator_go_live_api_rollback_action_count": 4,
                "operator_go_live_api_watch_signal_count": 5,
                "operator_go_live_signoff_dossier_count": 3,
                "operator_go_live_signoff_evidence_url_count": 16,
                "operator_go_live_signoff_acceptance_criterion_count": 15,
                "operator_go_live_signoff_stop_condition_count": 12,
                "operator_go_live_signoff_no_secret_check_count": 15,
                "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-14T00:15:40+00:00",
        "summary": "No-Secret-Smoke für DACH-Crawler-Operations, Timer-Runner, User-Agent, Seedquelle, Performance-Grenzen, Recent-Reportlinks, Public-Test-Index-Qualitätskontrollen und Screenshot-Preview-Coverage.",
        "metrics": {
            "target_count": 11,
            "http_passed_count": 11,
            "http_failed_count": 0,
            "target_duration_measured_count": 11,
            "target_duration_max_ms": 2416,
            "target_duration_p95_ms": 2416,
            "target_duration_budget_ms": 8000,
            "target_duration_slow_count": 0,
            "check_count": 19,
            "passed_check_count": 19,
            "warning_check_count": 0,
            "failed_check_count": 0,
            "crawler_available": 1,
            "timer_available": 1,
            "dach_check_count": 1249,
            "queue_count": 1078,
            "seed_file_host_count": 86,
            "recent_report_count": 36,
            "test_index_visible_count": 200,
            "test_index_total_public_checks": 1433,
            "test_index_preview_coverage_percent": 99.9,
            "test_index_preview_missing_count": 2,
            "test_index_preview_actionable_missing_count": 0,
            "test_index_preview_unreachable_missing_count": 2,
            "test_index_preview_renderer_failed_missing_count": 2,
            "test_index_preview_legacy_size_count": 0,
            "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-v4-viewport-transparency-160x150",
            "test_index_canonical_short_url_count": 200,
            "test_index_direct_report_link_count": 200,
            "test_index_preview_ready_item_count": 199,
            "test_index_preview_contract_item_count": 200,
            "test_index_hash_report_link_count": 0,
            "test_index_php_report_link_count": 0,
            "test_index_crawler_german_count": 1249,
            "test_index_quality_control_count": 11,
            "test_index_quality_control_failed_count": 0,
            "test_index_quality_control_warning_count": 0,
            "test_index_quality_boundary_count": 11,
            "test_index_quality_direct_link_count": 200,
            "test_index_quality_preview_contract_count": 200,
            "test_index_quality_operator_link_count": 200,
            "test_index_quality_discovery_link_count": 25,
            "test_index_discovery_manifest_available": 1,
            "test_index_discovery_manifest_linked_check_count": 1433,
            "test_index_discovery_manifest_letter_url_count": 25,
            "test_index_discovery_manifest_letter_page_url_count": 26,
            "test_index_discovery_manifest_test_sitemap_url_count": 26,
            "test_index_discovery_manifest_latest_page_count": 8,
            "test_index_discovery_manifest_latest_page_url_count": 8,
            "test_index_discovery_manifest_export_format_count": 4,
            "test_index_public_summary_raw_hard_warning_count": 199,
            "test_index_public_summary_hard_warning_count": 0,
            "test_index_public_summary_reframed_count": 200,
            "test_index_public_summary_signal_wording_count": 200,
            "preview_coverage_percent": 99.9,
            "preview_missing_count": 2,
            "preview_actionable_missing_count": 0,
            "preview_unreachable_missing_count": 2,
            "preview_renderer_failed_missing_count": 2,
            "error_rate_percent": 2.05,
            "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,
            "preview_backfill_target_count": 0,
            "preview_backfill_processed_count": 0,
            "preview_backfill_ok_count": 0,
            "preview_backfill_skipped_count": 0,
            "preview_backfill_failed_count": 0,
            "preview_backfill_remaining_estimate": 0,
            "preview_backfill_max_per_run": 24,
            "preview_backfill_concurrency": 2,
            "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-15T03:42:09+00:00",
        "summary": "No-Secret-Smoke für Trust-Readiness, Gated-Trust-Dossier, Viewer-Datenschutz, Questionnaire-Review, Export-Blueprints, Data-Room-Gates und Public-Evidence-Linkvertrag.",
        "metrics": {
            "target_count": 44,
            "http_passed_count": 44,
            "http_failed_count": 0,
            "check_count": 26,
            "passed_check_count": 25,
            "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": 18,
            "advanced_trust_module_passed_count": 18,
            "preview_contract_width": 160,
            "preview_contract_height": 150,
            "preview_contract_fit": "contain",
            "preview_contract_source_capture": "full_page",
            "preview_contract_capture_version": "contain-v4-viewport-transparency-160x150",
            "gated_public_trust_coverage_percent": 100,
            "gated_blocked_gate_count": 7,
            "gated_pending_gate_count": 2,
            "gated_private_beta_launch_kit_item_count": 6,
            "gated_access_journey_dry_run_step_count": 6,
            "gated_legal_nda_signoff_item_count": 5,
            "gated_document_release_receipt_item_count": 5,
            "gated_viewer_cleanup_drill_step_count": 5,
            "gated_questionnaire_intake_pilot_item_count": 6,
            "gated_parity_claim_lane_count": 5,
            "gated_parity_claim_public_ready_count": 1,
            "gated_parity_claim_gated_readiness_count": 2,
            "gated_parity_claim_blocked_live_count": 2,
            "gated_parity_claim_operator_input_count": 5,
            "gated_parity_claim_do_not_claim_count": 5,
            "gated_parity_claim_acceptance_criterion_count": 15,
            "gated_parity_claim_evidence_url_count": 16,
            "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,
            "questionnaire_operations_digest_public_route_count": 13,
            "questionnaire_operations_digest_workflow_step_count": 7,
            "questionnaire_operations_digest_readiness_gate_count": 6,
            "questionnaire_operations_digest_blocked_gate_count": 4,
            "questionnaire_operations_digest_operator_action_count": 5,
            "questionnaire_operations_digest_answer_quality_control_count": 5,
            "questionnaire_operations_digest_private_access_handoff_count": 5,
            "questionnaire_operations_digest_audit_manifest_count": 4,
            "questionnaire_operations_digest_go_live_acceptance_criterion_count": 5,
            "questionnaire_operations_digest_pilot_activation_step_count": 6,
            "questionnaire_operations_digest_dry_run_fixture_count": 4,
            "questionnaire_operations_digest_rollback_drill_step_count": 5,
            "questionnaire_operations_digest_consolidation_status_count": 6,
            "questionnaire_operations_digest_claim_boundary_count": 6,
            "questionnaire_operations_digest_parity_closure_plan_count": 6,
            "questionnaire_operations_digest_parity_closure_done_count": 0,
            "questionnaire_operations_digest_parity_closure_waiting_count": 6,
            "questionnaire_operations_digest_parity_closure_unlock_count": 18,
            "questionnaire_operations_digest_parity_closure_acceptance_criterion_count": 18,
            "questionnaire_operations_digest_parity_closure_boundary_count": 6,
            "questionnaire_operations_digest_parity_closure_evidence_url_count": 6,
            "questionnaire_pilot_signoff_receipt_private_input_count": 9,
            "questionnaire_pilot_signoff_receipt_public_field_count": 10,
            "questionnaire_pilot_signoff_receipt_evidence_url_count": 8,
            "questionnaire_pilot_signoff_receipt_public_evidence_url_count": 8,
            "questionnaire_pilot_signoff_receipt_verification_check_count": 7,
            "questionnaire_pilot_signoff_receipt_no_secret_attestation_count": 7,
            "questionnaire_pilot_signoff_receipt_activation_condition_count": 5,
            "questionnaire_pilot_signoff_receipt_stop_condition_count": 6,
            "trust_questionnaire_drill_evidence_pack_row_count": 6,
            "trust_questionnaire_drill_evidence_pack_passed_count": 4,
            "trust_questionnaire_drill_evidence_pack_blocked_expected_count": 2,
            "trust_questionnaire_drill_evidence_pack_evidence_url_count": 6,
            "trust_questionnaire_drill_evidence_pack_no_secret_boundary_count": 6,
            "trust_questionnaire_drill_evidence_pack_operator_input_count": 6,
            "trust_questionnaire_drill_evidence_pack_acceptance_criterion_count": 18,
            "trust_questionnaire_drill_evidence_pack_stop_condition_count": 18,
            "trust_ai_answer_assistant_sample_count": 7,
            "trust_ai_answer_assistant_review_required_count": 5,
            "trust_ai_answer_assistant_refusal_rule_count": 2,
            "trust_ai_answer_assistant_source_count": 6,
            "trust_ai_answer_assistant_policy_count": 6,
            "trust_ai_answer_assistant_average_confidence": 70,
            "trust_ai_answer_assistant_forbidden_public_field_count": 8,
            "trust_ai_answer_assistant_allowed_public_field_count": 6,
            "trust_ai_answer_assistant_public_route_count": 21,
            "trust_ai_answer_assistant_samples_complete": 1,
            "trust_ai_answer_citation_count": 15,
            "trust_ai_answer_citation_answer_count": 7,
            "trust_ai_answer_citation_review_required_count": 11,
            "trust_ai_answer_citation_reusable_past_answer_count": 2,
            "trust_ai_answer_citation_source_registry_count": 6,
            "trust_ai_answer_citation_approval_gate_count": 4,
            "trust_ai_answer_citation_public_route_count": 7,
            "trust_ai_answer_citations_complete": 1,
            "trust_past_answers_source_type_count": 5,
            "trust_past_answers_reuse_control_count": 5,
            "trust_past_answers_sanitization_queue_count": 5,
            "trust_past_answers_required_sanitization_count": 4,
            "trust_past_answers_enforced_sanitization_count": 1,
            "trust_past_answers_import_workflow_count": 4,
            "trust_past_answers_quality_signal_count": 5,
            "trust_past_answers_guardrail_count": 6,
            "trust_past_answers_enforced_guardrail_count": 3,
            "trust_past_answers_required_guardrail_count": 3,
            "trust_past_answers_non_reusable_source_count": 1,
            "trust_past_answers_public_route_count": 12,
            "trust_past_answers_required_before_live_count": 6,
            "trust_past_answers_readiness_score": 100,
            "trust_past_answers_sanitization_rows_complete": 1,
            "trust_past_answers_guardrail_rows_complete": 1,
            "questionnaire_localization_public_route_count": 10,
            "questionnaire_localization_language_workflow_count": 5,
            "questionnaire_localization_translation_gate_count": 7,
            "questionnaire_localization_blocked_gate_count": 1,
            "questionnaire_localization_export_rule_count": 4,
            "questionnaire_localization_operator_action_count": 4,
            "trust_portal_automation_portal_mode_count": 5,
            "trust_portal_automation_workflow_step_count": 6,
            "trust_portal_automation_extension_control_count": 5,
            "trust_portal_automation_review_queue_count": 5,
            "trust_portal_automation_payload_rule_count": 4,
            "trust_portal_automation_guardrail_count": 6,
            "trust_portal_automation_readiness_score": 100,
            "trust_communications_delivery_channel_count": 8,
            "trust_communications_ready_channel_count": 3,
            "trust_communications_review_channel_count": 5,
            "trust_communications_send_from_gate_count": 4,
            "trust_communications_notification_rule_count": 5,
            "trust_communications_workflow_step_count": 6,
            "trust_communications_audit_control_count": 5,
            "trust_communications_delivery_score": 100,
            "trust_updates_update_count": 8,
            "trust_updates_notify_candidate_count": 7,
            "trust_updates_high_priority_count": 2,
            "trust_updates_subscriber_segment_count": 3,
            "trust_updates_delivery_channel_count": 4,
            "trust_status_surface_count": 6,
            "trust_status_event_type_count": 6,
            "trust_status_publish_gate_count": 6,
            "trust_status_message_template_count": 5,
            "trust_status_channel_count": 5,
            "trust_status_guardrail_count": 6,
            "trust_status_readiness_score": 100,
            "viewer_record_class_count": 6,
            "viewer_connected_system_count": 5,
            "viewer_deletion_workflow_step_count": 6,
            "viewer_access_request_journey_step_count": 6,
            "viewer_self_service_control_count": 5,
            "viewer_access_decision_matrix_count": 4,
            "viewer_abuse_control_count": 5,
            "viewer_evidence_receipt_count": 4
        },
        "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-13T22:34:12+00:00",
        "summary": "Sanitisierter Availability- und Metadata-Smoke für offizielle Wettbewerbs-Primärquellen aus dem SaferPage Quellen-Watch.",
        "metrics": {
            "source_count": 35,
            "reachable_count": 32,
            "manual_review_required_count": 3,
            "client_error_review_required_count": 0,
            "server_error_count": 0,
            "transport_failed_count": 0,
            "hard_failure_count": 0,
            "check_count": 5,
            "failed_check_count": 0,
            "source_watch_source_count": 35,
            "source_watch_official_url_count": 35,
            "source_watch_checked_at_count": 35,
            "source_watch_freshness_status_count": 35,
            "source_watch_next_review_count": 35,
            "source_watch_stale_at_count": 35,
            "source_watch_evidence_summary_count": 35,
            "source_watch_saferpage_implication_count": 35,
            "source_watch_feature_mapping_count": 35,
            "source_watch_review_queue_count": 35,
            "source_watch_review_queue_source_id_count": 35,
            "source_watch_review_queue_status_count": 35,
            "source_watch_review_queue_state_count": 35,
            "source_watch_review_queue_priority_count": 35,
            "source_watch_review_queue_next_review_count": 35,
            "source_watch_review_queue_boundary_count": 35,
            "source_watch_review_queue_watch_url_count": 35,
            "source_watch_review_queue_decision_count": 35,
            "source_watch_freshness_current_count": 35,
            "source_watch_freshness_due_soon_count": 0,
            "source_watch_freshness_due_count": 0,
            "source_watch_freshness_stale_count": 0,
            "source_watch_freshness_unknown_count": 0,
            "source_watch_max_age_days": 2,
            "source_watch_oldest_checked_at_present": 1,
            "manual_review_dossier_count": 3,
            "manual_review_dossier_step_count": 18,
            "manual_review_dossier_acceptance_count": 15,
            "manual_review_dossier_evidence_url_count": 9,
            "manual_review_dossier_fallback_url_count": 9,
            "manual_review_dossier_fallback_complete_count": 3,
            "manual_review_dossier_boundary_count": 3,
            "target_count": 35,
            "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-15T01:11:38+00:00",
        "summary": "No-Secret-Smoke für 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": 7,
            "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-15T00:27:44+00:00",
        "summary": "No-Secret-Smoke für 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": 17,
            "failed_check_count": 0,
            "blocked_expected_count": 2,
            "missing_required_secret_reference_count": 3,
            "storage_missing_database_artifact_count": 0,
            "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-15T00:27:41+00:00",
        "summary": "No-Secret-Smoke für API-Key-Readiness, Migration-Preflight, Runtime-Gates und Operator-Go-live-Verknuepfung.",
        "metrics": {
            "target_count": 9,
            "http_passed_count": 9,
            "http_failed_count": 0,
            "check_count": 21,
            "failed_check_count": 0,
            "blocked_expected_count": 0,
            "api_access_storage_table_count": 2,
            "api_access_storage_ready": 1,
            "missing_required_artifact_count": 0,
            "api_access_preflight_required_artifact_count": 2,
            "api_access_preflight_ready_artifact_count": 2,
            "api_access_preflight_missing_artifact_count": 0,
            "api_access_preflight_admin_dsn_required": 0,
            "api_runtime_public_route_count": 4,
            "api_runtime_protected_route_count": 7,
            "api_runtime_denied_fixture_count": 4,
            "api_runtime_live_denied_fixture_count": 0,
            "api_runtime_write_hmac_fixture_count": 1,
            "api_runtime_write_hmac_negative_test_count": 4,
            "api_runtime_systemd_service_contract": 1,
            "api_runtime_fallback_audit_events_24h": 0,
            "api_runtime_deny_smoke_ok": 1,
            "api_runtime_deny_smoke_status_code": 401,
            "api_runtime_controls_ok": 1,
            "api_runtime_controls_control_count": 8,
            "api_runtime_controls_enabled_control_count": 8,
            "api_runtime_controls_missing_control_count": 0,
            "api_runtime_controls_secret_value_count": 0,
            "api_runtime_controls_no_secret_policy_ok": 1,
            "api_developer_quickstart_count": 4,
            "api_error_contract_count": 6,
            "api_rotation_playbook_step_count": 5,
            "api_client_acceptance_criterion_count": 6,
            "api_issuance_receipt_item_count": 6,
            "api_rate_limit_tier_count": 5,
            "api_abuse_response_step_count": 5,
            "api_post_issuance_watch_signal_count": 5,
            "api_openapi_contract_item_count": 6,
            "api_postman_collection_request_count": 5,
            "api_sdk_readiness_language_count": 5,
            "api_sandbox_onboarding_step_count": 6,
            "api_webhook_receiver_acceptance_count": 5,
            "api_support_slo_tier_count": 4,
            "api_access_page_developer_launch_kit_visible": 1,
            "api_access_openapi_export_ready": 1,
            "api_access_openapi_path_count": 6,
            "api_access_openapi_bearer_auth": 1,
            "api_access_openapi_no_secret_policy_ok": 1,
            "api_access_postman_collection_ready": 1,
            "api_access_postman_request_count": 7,
            "api_access_postman_bearer_placeholder": 1,
            "api_access_postman_no_secret_policy_ok": 1,
            "api_access_postman_forbidden_secret_hit_count": 0,
            "api_consolidation_status_count": 4,
            "api_claim_boundary_count": 4,
            "api_parity_closure_plan_count": 6,
            "api_parity_closure_done_count": 0,
            "api_parity_closure_waiting_count": 6,
            "api_parity_closure_unlock_count": 18,
            "api_parity_closure_acceptance_count": 18,
            "api_parity_closure_operator_input_count": 18,
            "api_parity_closure_boundary_count": 6,
            "api_parity_closure_evidence_url_count": 6,
            "api_migration_signoff_item_count": 5,
            "api_migration_rollback_rehearsal_step_count": 4,
            "api_post_migration_canary_step_count": 6,
            "api_db_owner_handoff_step_count": 5,
            "api_db_owner_handoff_private_input_count": 5,
            "api_db_owner_handoff_public_output_count": 6,
            "api_db_owner_handoff_forbidden_output_count": 8,
            "api_db_owner_handoff_acceptance_count": 6,
            "api_db_owner_handoff_evidence_url_count": 6,
            "api_db_owner_handoff_validation_query_count": 5,
            "api_db_owner_handoff_safe_command_count": 4,
            "operator_go_live_activation_packet_count": 3,
            "operator_go_live_api_activation_step_count": 6,
            "operator_go_live_api_rollback_action_count": 4,
            "operator_go_live_api_watch_signal_count": 5,
            "operator_go_live_signoff_dossier_count": 3,
            "operator_go_live_signoff_evidence_url_count": 16,
            "operator_go_live_signoff_acceptance_criterion_count": 15,
            "operator_go_live_signoff_stop_condition_count": 12,
            "operator_go_live_signoff_no_secret_check_count": 15,
            "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": 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 für 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": "Basisinstallation prüfen; Scan-Results-Tabelle sollte für Reports vorhanden sein.",
                "purpose": "Vorhandene Reportbasis für Public- und Operator-Read-Flows.",
                "ready": false,
                "required_for_key_store": false,
                "status": "optional_missing"
            }
        ],
        "database_reachable": false,
        "error_class": "connection_failed",
        "generated_at": "2026-07-14T20:54:01.516354Z",
        "migration_path": "infra/postgres/migrations/api-access.sql",
        "migration_required": false,
        "migration_sha256": "27d802d48887d084e9132c841b943681c70638bd432746a92cab7809be621213",
        "missing_artifact_count": 2,
        "missing_required_artifacts": [
            "api_keys_table",
            "api_access_audit_log_table"
        ],
        "ok": false,
        "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 ausführen und missing_required_artifacts prüfen.",
            "scripts/run-api-access-migration.sh mit Admin-DSN ausführen.",
            "Preflight erneut ausführen, danach API-Key-Pepper, Domain-Claim, Write-HMAC und Deny/Allow-Smokes aktivieren."
        ],
        "ready_artifact_count": 0,
        "required_artifact_count": 2,
        "safe_apply_command": "SAFERPAGE_MIGRATION_DATABASE_URL='<admin-dsn-from-secure-shell>' scripts/run-api-access-migration.sh",
        "safe_combined_apply_command": "SAFERPAGE_MIGRATION_DATABASE_URL='<admin-dsn-from-secure-shell>' scripts/run-storage-migrations.sh",
        "safe_next_action": "Restore database connectivity and rerun this preflight before applying the migration.",
        "safe_preflight_command": "scripts/run-api-access-migration-preflight.sh",
        "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": false,
        "available": true,
        "checks": [
            {
                "id": "security_feed_observations_table",
                "label": "Feed-Observations-Tabelle",
                "operator_action": "infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung 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-Admin-Verantwortung aus sicherer Shell anwenden.",
                "purpose": "Verknuepft private Feed-Observations mit Alerts/Nachweispositionen 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-Admin-Verantwortung 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-Admin-Verantwortung 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-Admin-Verantwortung 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-Admin-Verantwortung aus sicherer Shell anwenden.",
                "purpose": "Lösch- und Ablaufjobs finden fällige 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-Admin-Verantwortung 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-Admin-Verantwortung 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-Admin-Verantwortung aus sicherer Shell anwenden.",
                "purpose": "Audit-Events können 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-Admin-Verantwortung aus sicherer Shell anwenden.",
                "purpose": "Änderungen 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-Admin-Verantwortung aus sicherer Shell anwenden.",
                "purpose": "Änderungen setzen updated_at automatisch.",
                "ready": false,
                "required_for_storage": true,
                "status": "missing"
            }
        ],
        "database_reachable": false,
        "error_class": "connection_failed",
        "generated_at": "2026-07-14T20:54:01.571485Z",
        "migration_path": "infra/postgres/migrations/security-feed-storage.sql",
        "migration_required": false,
        "migration_sha256": "bcaa177b61f0c9ea578e80abcdb8fa2af9c0615fd197f153b7367161603e9453",
        "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"
        ],
        "ok": false,
        "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 ausführen und missing_required_artifacts prüfen.",
            "infra/postgres/migrations/security-feed-storage.sql mit DB-Admin-Verantwortung anwenden oder scripts/run-storage-migrations.sh nutzen.",
            "Preflight erneut ausführen, danach Retention/Review freigeben und erst dann SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED setzen.",
            "Storage-Canary ausführen, bevor echte externe Feed-Treffer gespeichert werden."
        ],
        "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='<admin-dsn-from-secure-shell>' scripts/run-storage-migrations.sh",
        "safe_next_action": "Restore database connectivity and rerun this preflight before applying the migration.",
        "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.",
        "url": "https://saferpage.de/evidence/security-feed-storage-preflight.json"
    },
    "runtime_control_manifests": [
        {
            "id": "api_runtime_controls",
            "label": "API Runtime Controls",
            "ok": true,
            "status": "public_runtime_controls_ready",
            "schema": "https://saferpage.de/schemas/operator-api-runtime-controls.v1",
            "generated_at": "2026-06-13T12:00:08Z",
            "url": "https://saferpage.de/evidence/api-runtime-controls.json",
            "summary": "Öffentliches No-Secret-Manifest für API-Runtime-Kontrollen: 8/8 Kontrollen dokumentiert; keine Produktivfreigabe und keine Secret-Ausgabe.",
            "claim_boundary": "Dieses Manifest belegt nur die öffentliche Praesenz der API-Runtime-Kontrollen. Es erzeugt keine API-Keys, schaltet keine produktive Nutzung frei und ersetzt keine Betreiberfreigabe.",
            "secret_policy": "This manifest exposes control presence only. It contains no API keys, hashes, peppers, HMAC secrets, IPs, user agents, database DSNs, raw payloads or visitor logs.",
            "control_count": 8,
            "enabled_control_count": 8,
            "missing_control_count": 0,
            "secret_value_count": 0,
            "no_secret_policy_ok": true
        },
        {
            "id": "delivery_runtime_controls",
            "label": "Delivery Runtime Controls",
            "ok": true,
            "status": "public_runtime_controls_ready",
            "schema": "https://saferpage.de/schemas/delivery-runtime-controls.v1",
            "generated_at": "2026-06-13T12:00:08Z",
            "url": "https://saferpage.de/evidence/delivery-runtime-controls.json",
            "summary": "Öffentliches No-Secret-Manifest für Alert-Delivery-Runtime-Kontrollen: 8/8 Kontrollen dokumentiert; keine externe Zustellung und keine Secret-Ausgabe.",
            "claim_boundary": "Dieses Manifest belegt nur die öffentliche Praesenz der Delivery-Runtime-Kontrollen. Es konfiguriert keine Zielsysteme, versendet keine Alerts und ersetzt keine Betreiberfreigabe.",
            "secret_policy": "This manifest exposes control presence only. It contains no webhook URLs, Slack or Teams URLs, API keys, HMAC secrets, recipients, target URLs, raw payloads, IPs, user agents, database DSNs or visitor logs.",
            "control_count": 8,
            "enabled_control_count": 8,
            "missing_control_count": 0,
            "secret_value_count": 0,
            "no_secret_policy_ok": true
        },
        {
            "id": "security_feed_runtime_controls",
            "label": "Security-Feed Runtime Controls",
            "ok": true,
            "status": "public_runtime_controls_ready",
            "schema": "https://saferpage.de/schemas/security-feed-runtime-controls.v1",
            "generated_at": "2026-06-13T12:00:08Z",
            "url": "https://saferpage.de/evidence/security-feed-runtime-controls.json",
            "summary": "Öffentliches No-Secret-Manifest für Security-Feed-Runtime-Kontrollen: 7/7 Kontrollen dokumentiert; keine externen Feed-Runs, keine produktive Speicherung und keine Secret-Ausgabe.",
            "claim_boundary": "Dieses Manifest belegt nur die öffentliche Praesenz der Security-Feed-Runtime-Kontrollen. Es ruft keine externen Feeds auf, speichert keine echten Observations und ersetzt keine Betreiberfreigabe.",
            "secret_policy": "This manifest exposes control presence only. It contains no URLhaus keys, Google API keys, webhook secrets, feed raw payloads, IPs, user agents, database DSNs or visitor logs.",
            "control_count": 7,
            "enabled_control_count": 7,
            "missing_control_count": 0,
            "secret_value_count": 0,
            "no_secret_policy_ok": true
        }
    ],
    "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",
                "python3 scripts/run-alert-dispatch.py --max 1"
            ],
            "acceptance_criteria": [
                "Alert-Delivery-Readiness-Smoke ist grün: 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 für Audit-Dry-runs zugelassen.",
                "SAFERPAGE_ALERT_DISPATCH_APPROVED=yes ist erst nach dokumentierter Betreiberfreigabe gesetzt.",
                "Receiver prüft Idempotency-Key und optional HMAC-Signatur.",
                "Public-State zeigt keine Ziel-URLs, Tokens, Empfänger oder Rohpayloads."
            ],
            "stop_conditions": [
                "sent_count steigt ohne Approval-Record.",
                "Webhook-URL, Token oder Empfänger erscheinen in Public-State, Logs oder Exporten.",
                "Zielsystem erzeugt Duplikate trotz Idempotency-Key.",
                "Runner error_count ist größer 0."
            ],
            "operator_steps": [
                "Zielsystem-Verantwortlichkeit und Testkanal festlegen.",
                "Secrets in /etc/saferpage/alert-dispatch.env oder Secret Manager setzen.",
                "Dry-run ausführen und Runner-State prüfen.",
                "Receiver-Signatur und Dedupe prüfen.",
                "Freigabe setzen und nach erstem Lauf sent/error prüfen."
            ],
            "no_secret_policy": "Nur Referenznamen, Status, Hashes, Commands und Evidence-URLs werden exportiert; keine DSN, Passwörter, API-Keys, Tokens, Ziel-URLs, Empfänger, 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 grün: 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 läuft 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 läuft ohne explizites Run-Gate.",
                "stored_observation_count steigt vor Storage-Freigabe.",
                "Launch-Board zeigt Runner-Fehler oder unerklärte externe Ausführungen."
            ],
            "operator_steps": [
                "Feed-Quellen und Zweck freigeben.",
                "Secrets nur serverseitig setzen.",
                "Storage-Migration und Preflight prüfen.",
                "Canary ohne externe Feed-Abfrage ausführen.",
                "Erst danach Storage-Approval und optional Live-Probe setzen."
            ],
            "no_secret_policy": "Nur Referenznamen, Status, Hashes, Commands und Evidence-URLs werden exportiert; keine DSN, Passwörter, API-Keys, Tokens, Ziel-URLs, Empfänger, 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 2/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 prüfen.",
                "Kurzlebigen Admin-DSN nur in sicherer Shell setzen.",
                "Migration anwenden und Preflight erneut prüfen.",
                "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, Passwörter, API-Keys, Tokens, Ziel-URLs, Empfänger, Rohpayloads oder Besucherlogs."
        }
    ],
    "operator_activation_packets": [
        {
            "id": "activation_delivery_targets_and_approval",
            "phase_id": "delivery_targets_and_approval",
            "label": "Alert-Zustellung freigeben",
            "status": "waiting_for_secure_inputs",
            "owner": "IT/Security",
            "current_blocker": "Externes Webhook/Slack/Teams-Ziel fehlt. SAFERPAGE_ALERT_DISPATCH_APPROVED ist nicht aktiv.",
            "phase_count": 6,
            "phases": [
                {
                    "id": "evidence_freeze",
                    "label": "Öffentliche Evidence einfrieren",
                    "required_evidence": [
                        "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"
                    ],
                    "exit_criterion": "Go-live-JSON, Parity-Board, Evidence-Hub und No-Secret-Smokes sind archiviert und ohne Secret-Leak prüfbar."
                },
                {
                    "id": "secure_configuration",
                    "label": "Sichere Server-Konfiguration setzen",
                    "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"
                    ],
                    "exit_criterion": "Env-Referenzen sind nur im Server-Environment oder Secret Manager gesetzt; Public-Exports zeigen ausschließlich Referenznamen."
                },
                {
                    "id": "dry_run",
                    "label": "Dry-run und Deny-Smokes ausführen",
                    "safe_commands": [
                        "scripts/run-alert-delivery-readiness-smoke.sh",
                        "scripts/run-alert-dispatch-dry-run-smoke.sh",
                        "python3 scripts/run-alert-dispatch.py --max 1"
                    ],
                    "exit_criterion": "Dry-run-/Deny-Smokes laufen ohne externe Nebenwirkung und ohne Secret-Ausgabe."
                },
                {
                    "id": "operator_signoff",
                    "label": "Betreiberfreigabe dokumentieren",
                    "approval_record_template": [
                        "approver_role",
                        "approved_at",
                        "scope",
                        "evidence_urls",
                        "smoke_result_refs",
                        "rollback_owner",
                        "expires_or_review_at"
                    ],
                    "exit_criterion": "Freigabe ist scope-begrenzt, zeitlich reviewbar und mit Rollback-Verantwortlichkeit dokumentiert."
                },
                {
                    "id": "controlled_activation",
                    "label": "Kontrolliert aktivieren",
                    "safe_commands": [
                        "scripts/run-alert-delivery-readiness-smoke.sh",
                        "scripts/run-alert-dispatch-dry-run-smoke.sh",
                        "python3 scripts/run-alert-dispatch.py --max 1"
                    ],
                    "exit_criterion": "Nur das freigegebene Gate wird aktiviert; Runner-State und Public-State bleiben no-secret."
                },
                {
                    "id": "post_go_live_watch",
                    "label": "Nachlauf beobachten",
                    "required_evidence": [
                        "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"
                    ],
                    "exit_criterion": "Nachlauf zeigt keine Fehler, keine Duplikate, keine unerwarteten Writes und keine Secret-/Empfänger-/Rohpayload-Leaks."
                }
            ],
            "safe_env_template": [
                {
                    "env_ref": "SAFERPAGE_ALERT_DISPATCH_APPROVED",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_WEBHOOK_URL",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_WEBHOOK_SECRET",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_SLACK_WEBHOOK_URL",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_TEAMS_WEBHOOK_URL",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_LOCAL_FILE_SINK_PATH",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                }
            ],
            "safe_commands": [
                "scripts/run-alert-delivery-readiness-smoke.sh",
                "scripts/run-alert-dispatch-dry-run-smoke.sh",
                "python3 scripts/run-alert-dispatch.py --max 1"
            ],
            "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 grün: 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 für Audit-Dry-runs zugelassen.",
                "SAFERPAGE_ALERT_DISPATCH_APPROVED=yes ist erst nach dokumentierter Betreiberfreigabe gesetzt.",
                "Receiver prüft Idempotency-Key und optional HMAC-Signatur.",
                "Public-State zeigt keine Ziel-URLs, Tokens, Empfänger oder Rohpayloads."
            ],
            "stop_conditions": [
                "sent_count steigt ohne Approval-Record.",
                "Webhook-URL, Token oder Empfänger erscheinen in Public-State, Logs oder Exporten.",
                "Zielsystem erzeugt Duplikate trotz Idempotency-Key.",
                "Runner error_count ist größer 0."
            ],
            "rollback_plan": {
                "owner": "IT/Security",
                "trigger": "Eine Stop-Bedingung tritt ein, Smoke-Evidence wird rot oder Public-State enthält vertrauliche Werte.",
                "actions": [
                    "Gate-Env-Ref auf disabled/0 zurücksetzen.",
                    "Runner stoppen oder Timer deaktivieren.",
                    "Letzten Public-State und Logs no-secret prüfen.",
                    "Parity-/Go-live-JSON nach Deaktivierung erneut veröffentlichen."
                ]
            },
            "post_go_live_watch": {
                "duration": "24h nach erster Aktivierung",
                "signals": [
                    "Runner error_count",
                    "sent/executed/stored counters",
                    "idempotency duplicates",
                    "public_export_secret_pattern_hits",
                    "operator rollback ack"
                ],
                "success_criterion": "Keine Stop-Bedingung, keine Secret-Leaks, keine unerwarteten externen Nebenwirkungen."
            },
            "no_secret_policy": "Dieses Aktivierungspaket gibt nur Env-Referenzen, sichere Placeholder, Evidence-URLs, Kommandonamen, Abnahmekriterien, Stop-Bedingungen, Rollback- und Beobachtungsregeln aus; keine DSN, Passwörter, API-Keys, Tokens, Ziel-URLs, Empfänger, Rohpayloads oder Besucherlogs."
        },
        {
            "id": "activation_security_feed_credentials_and_storage",
            "phase_id": "security_feed_credentials_and_storage",
            "label": "Security-Feeds aktivieren",
            "status": "waiting_for_secure_inputs",
            "owner": "IT/Security + Datenschutz",
            "current_blocker": "URLhaus/Safe-Browsing-Credentials fehlen. SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED ist nicht aktiv.",
            "phase_count": 6,
            "phases": [
                {
                    "id": "evidence_freeze",
                    "label": "Öffentliche Evidence einfrieren",
                    "required_evidence": [
                        "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"
                    ],
                    "exit_criterion": "Go-live-JSON, Parity-Board, Evidence-Hub und No-Secret-Smokes sind archiviert und ohne Secret-Leak prüfbar."
                },
                {
                    "id": "secure_configuration",
                    "label": "Sichere Server-Konfiguration setzen",
                    "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"
                    ],
                    "exit_criterion": "Env-Referenzen sind nur im Server-Environment oder Secret Manager gesetzt; Public-Exports zeigen ausschließlich Referenznamen."
                },
                {
                    "id": "dry_run",
                    "label": "Dry-run und Deny-Smokes ausführen",
                    "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"
                    ],
                    "exit_criterion": "Dry-run-/Deny-Smokes laufen ohne externe Nebenwirkung und ohne Secret-Ausgabe."
                },
                {
                    "id": "operator_signoff",
                    "label": "Betreiberfreigabe dokumentieren",
                    "approval_record_template": [
                        "approver_role",
                        "approved_at",
                        "scope",
                        "evidence_urls",
                        "smoke_result_refs",
                        "rollback_owner",
                        "expires_or_review_at"
                    ],
                    "exit_criterion": "Freigabe ist scope-begrenzt, zeitlich reviewbar und mit Rollback-Verantwortlichkeit dokumentiert."
                },
                {
                    "id": "controlled_activation",
                    "label": "Kontrolliert aktivieren",
                    "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"
                    ],
                    "exit_criterion": "Nur das freigegebene Gate wird aktiviert; Runner-State und Public-State bleiben no-secret."
                },
                {
                    "id": "post_go_live_watch",
                    "label": "Nachlauf beobachten",
                    "required_evidence": [
                        "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"
                    ],
                    "exit_criterion": "Nachlauf zeigt keine Fehler, keine Duplikate, keine unerwarteten Writes und keine Secret-/Empfänger-/Rohpayload-Leaks."
                }
            ],
            "safe_env_template": [
                {
                    "env_ref": "SAFERPAGE_URLHAUS_AUTH_KEY",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_SECURITY_FEED_PREFLIGHT_APPROVED",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_WEBHOOK_SECRET",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_OPERATOR_WEBHOOK_SECRET",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                }
            ],
            "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 grün: 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 läuft 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 läuft ohne explizites Run-Gate.",
                "stored_observation_count steigt vor Storage-Freigabe.",
                "Launch-Board zeigt Runner-Fehler oder unerklärte externe Ausführungen."
            ],
            "rollback_plan": {
                "owner": "IT/Security + Datenschutz",
                "trigger": "Eine Stop-Bedingung tritt ein, Smoke-Evidence wird rot oder Public-State enthält vertrauliche Werte.",
                "actions": [
                    "Gate-Env-Ref auf disabled/0 zurücksetzen.",
                    "Runner stoppen oder Timer deaktivieren.",
                    "Letzten Public-State und Logs no-secret prüfen.",
                    "Parity-/Go-live-JSON nach Deaktivierung erneut veröffentlichen."
                ]
            },
            "post_go_live_watch": {
                "duration": "24h nach erster Aktivierung",
                "signals": [
                    "Runner error_count",
                    "sent/executed/stored counters",
                    "idempotency duplicates",
                    "public_export_secret_pattern_hits",
                    "operator rollback ack"
                ],
                "success_criterion": "Keine Stop-Bedingung, keine Secret-Leaks, keine unerwarteten externen Nebenwirkungen."
            },
            "no_secret_policy": "Dieses Aktivierungspaket gibt nur Env-Referenzen, sichere Placeholder, Evidence-URLs, Kommandonamen, Abnahmekriterien, Stop-Bedingungen, Rollback- und Beobachtungsregeln aus; keine DSN, Passwörter, API-Keys, Tokens, Ziel-URLs, Empfänger, Rohpayloads oder Besucherlogs."
        },
        {
            "id": "activation_operator_api_key_readiness",
            "phase_id": "operator_api_key_readiness",
            "label": "Operator-API-Key-Store freischalten",
            "status": "waiting_for_secure_inputs",
            "owner": "IT/Security",
            "current_blocker": "API-Access-Storage 2/2 Tabellen; produktive API-Key-Freigaben 0/7.",
            "phase_count": 6,
            "phases": [
                {
                    "id": "evidence_freeze",
                    "label": "Öffentliche Evidence einfrieren",
                    "required_evidence": [
                        "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"
                    ],
                    "exit_criterion": "Go-live-JSON, Parity-Board, Evidence-Hub und No-Secret-Smokes sind archiviert und ohne Secret-Leak prüfbar."
                },
                {
                    "id": "secure_configuration",
                    "label": "Sichere Server-Konfiguration setzen",
                    "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"
                    ],
                    "exit_criterion": "Env-Referenzen sind nur im Server-Environment oder Secret Manager gesetzt; Public-Exports zeigen ausschließlich Referenznamen."
                },
                {
                    "id": "dry_run",
                    "label": "Dry-run und Deny-Smokes ausführen",
                    "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"
                    ],
                    "exit_criterion": "Dry-run-/Deny-Smokes laufen ohne externe Nebenwirkung und ohne Secret-Ausgabe."
                },
                {
                    "id": "operator_signoff",
                    "label": "Betreiberfreigabe dokumentieren",
                    "approval_record_template": [
                        "approver_role",
                        "approved_at",
                        "scope",
                        "evidence_urls",
                        "smoke_result_refs",
                        "rollback_owner",
                        "expires_or_review_at"
                    ],
                    "exit_criterion": "Freigabe ist scope-begrenzt, zeitlich reviewbar und mit Rollback-Verantwortlichkeit dokumentiert."
                },
                {
                    "id": "controlled_activation",
                    "label": "Kontrolliert aktivieren",
                    "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"
                    ],
                    "exit_criterion": "Nur das freigegebene Gate wird aktiviert; Runner-State und Public-State bleiben no-secret."
                },
                {
                    "id": "post_go_live_watch",
                    "label": "Nachlauf beobachten",
                    "required_evidence": [
                        "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"
                    ],
                    "exit_criterion": "Nachlauf zeigt keine Fehler, keine Duplikate, keine unerwarteten Writes und keine Secret-/Empfänger-/Rohpayload-Leaks."
                }
            ],
            "safe_env_template": [
                {
                    "env_ref": "SAFERPAGE_MIGRATION_DATABASE_URL",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_API_KEY_STORE_READY",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_API_SCOPE_ENFORCEMENT_READY",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_API_ACCESS_AUDIT_READY",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_API_RATE_LIMIT_READY",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_API_REVOCATION_READY",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_API_DOMAIN_CLAIM_READY",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_API_WRITE_HMAC_READY",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                },
                {
                    "env_ref": "SAFERPAGE_API_WRITE_HMAC_SECRET",
                    "value": "__SET_IN_SECRET_MANAGER_OR_SECURE_SERVER_ENV__",
                    "public_export_allowed": false
                }
            ],
            "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."
            ],
            "rollback_plan": {
                "owner": "IT/Security",
                "trigger": "Eine Stop-Bedingung tritt ein, Smoke-Evidence wird rot oder Public-State enthält vertrauliche Werte.",
                "actions": [
                    "Gate-Env-Ref auf disabled/0 zurücksetzen.",
                    "Runner stoppen oder Timer deaktivieren.",
                    "Letzten Public-State und Logs no-secret prüfen.",
                    "Parity-/Go-live-JSON nach Deaktivierung erneut veröffentlichen."
                ]
            },
            "post_go_live_watch": {
                "duration": "24h nach erster Aktivierung",
                "signals": [
                    "Runner error_count",
                    "sent/executed/stored counters",
                    "idempotency duplicates",
                    "public_export_secret_pattern_hits",
                    "operator rollback ack"
                ],
                "success_criterion": "Keine Stop-Bedingung, keine Secret-Leaks, keine unerwarteten externen Nebenwirkungen."
            },
            "no_secret_policy": "Dieses Aktivierungspaket gibt nur Env-Referenzen, sichere Placeholder, Evidence-URLs, Kommandonamen, Abnahmekriterien, Stop-Bedingungen, Rollback- und Beobachtungsregeln aus; keine DSN, Passwörter, API-Keys, Tokens, Ziel-URLs, Empfänger, Rohpayloads oder Besucherlogs."
        }
    ],
    "operator_activation_evidence_map": {
        "schema": "https://saferpage.de/schemas/operator-activation-evidence-map.v1",
        "status": "review_ready_secure_inputs_required",
        "summary": "Verdichtete Betreiberkarte für blockierte Live-Claims: Aktivierungspaket, Signoff-Dossier und Runtime-Control-Manifest werden je Gate zusammengeführt, ohne Secrets, Ziel-URLs, Empfänger, Rohpayloads oder Besucherlogs offenzulegen.",
        "metrics": {
            "row_count": 3,
            "waiting_count": 3,
            "runtime_manifest_count": 3,
            "runtime_manifest_ok_count": 3,
            "runtime_control_count": 23,
            "runtime_enabled_control_count": 23,
            "runtime_missing_control_count": 0,
            "signoff_dossier_count": 3,
            "safe_env_ref_count": 21,
            "safe_command_count": 11,
            "evidence_url_count": 16,
            "acceptance_criterion_count": 15,
            "stop_condition_count": 12,
            "no_secret_check_count": 15,
            "rollback_owner_required_count": 3,
            "rows_complete": 1
        },
        "rows": [
            {
                "id": "activation_delivery_targets_and_approval",
                "phase_id": "delivery_targets_and_approval",
                "label": "Alert-Zustellung freigeben",
                "status": "waiting_for_secure_inputs",
                "owner": "IT/Security",
                "current_blocker": "Externes Webhook/Slack/Teams-Ziel fehlt. SAFERPAGE_ALERT_DISPATCH_APPROVED ist nicht aktiv.",
                "phase_count": 6,
                "safe_env_ref_count": 6,
                "safe_command_count": 3,
                "evidence_url_count": 5,
                "runtime_manifest_id": "delivery_runtime_controls",
                "runtime_manifest_url": "https://saferpage.de/evidence/delivery-runtime-controls.json",
                "runtime_manifest_ok": true,
                "runtime_control_count": 8,
                "runtime_enabled_control_count": 8,
                "runtime_missing_control_count": 0,
                "signoff_dossier_id": "signoff_delivery_targets_and_approval",
                "signoff_status": "waiting_for_operator_inputs",
                "signoff_primary_url": "https://saferpage.de/integrationen/delivery-credential-preflight-json",
                "acceptance_criterion_count": 5,
                "stop_condition_count": 4,
                "no_secret_check_count": 5,
                "rollback_owner_required": true,
                "safe_commands": [
                    "scripts/run-alert-delivery-readiness-smoke.sh",
                    "scripts/run-alert-dispatch-dry-run-smoke.sh",
                    "python3 scripts/run-alert-dispatch.py --max 1"
                ],
                "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"
                ],
                "claim_boundary": "Dieses Dossier beweist Readiness- und Freigabestatus, aber keine produktive Aktivierung. Live-Claims zu Alerts, Security-Feeds oder API-Keys sind erst nach dokumentiertem Betreiber-Signoff und erneuten Smokes zulässig."
            },
            {
                "id": "activation_security_feed_credentials_and_storage",
                "phase_id": "security_feed_credentials_and_storage",
                "label": "Security-Feeds aktivieren",
                "status": "waiting_for_secure_inputs",
                "owner": "IT/Security + Datenschutz",
                "current_blocker": "URLhaus/Safe-Browsing-Credentials fehlen. SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED ist nicht aktiv.",
                "phase_count": 6,
                "safe_env_ref_count": 6,
                "safe_command_count": 4,
                "evidence_url_count": 6,
                "runtime_manifest_id": "security_feed_runtime_controls",
                "runtime_manifest_url": "https://saferpage.de/evidence/security-feed-runtime-controls.json",
                "runtime_manifest_ok": true,
                "runtime_control_count": 7,
                "runtime_enabled_control_count": 7,
                "runtime_missing_control_count": 0,
                "signoff_dossier_id": "signoff_security_feed_credentials_and_storage",
                "signoff_status": "waiting_for_operator_inputs",
                "signoff_primary_url": "https://saferpage.de/sicherheit/feed-credential-preflight-json",
                "acceptance_criterion_count": 5,
                "stop_condition_count": 4,
                "no_secret_check_count": 5,
                "rollback_owner_required": true,
                "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"
                ],
                "claim_boundary": "Dieses Dossier beweist Readiness- und Freigabestatus, aber keine produktive Aktivierung. Live-Claims zu Alerts, Security-Feeds oder API-Keys sind erst nach dokumentiertem Betreiber-Signoff und erneuten Smokes zulässig."
            },
            {
                "id": "activation_operator_api_key_readiness",
                "phase_id": "operator_api_key_readiness",
                "label": "Operator-API-Key-Store freischalten",
                "status": "waiting_for_secure_inputs",
                "owner": "IT/Security",
                "current_blocker": "API-Access-Storage 2/2 Tabellen; produktive API-Key-Freigaben 0/7.",
                "phase_count": 6,
                "safe_env_ref_count": 9,
                "safe_command_count": 4,
                "evidence_url_count": 5,
                "runtime_manifest_id": "api_runtime_controls",
                "runtime_manifest_url": "https://saferpage.de/evidence/api-runtime-controls.json",
                "runtime_manifest_ok": true,
                "runtime_control_count": 8,
                "runtime_enabled_control_count": 8,
                "runtime_missing_control_count": 0,
                "signoff_dossier_id": "signoff_operator_api_key_readiness",
                "signoff_status": "waiting_for_operator_inputs",
                "signoff_primary_url": "https://saferpage.de/api-zugriff/key-readiness-json",
                "acceptance_criterion_count": 5,
                "stop_condition_count": 4,
                "no_secret_check_count": 5,
                "rollback_owner_required": true,
                "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"
                ],
                "claim_boundary": "Dieses Dossier beweist Readiness- und Freigabestatus, aber keine produktive Aktivierung. Live-Claims zu Alerts, Security-Feeds oder API-Keys sind erst nach dokumentiertem Betreiber-Signoff und erneuten Smokes zulässig."
            }
        ],
        "links": {
            "html": "https://saferpage.de/betreiber/go-live",
            "json": "https://saferpage.de/betreiber/go-live-json",
            "parity": "https://saferpage.de/vergleich/parity-readiness-json",
            "evidence_hub": "https://saferpage.de/evidence-hub-json",
            "competitive_smoke": "https://saferpage.de/evidence/competitive-evidence-health-smoke.json"
        },
        "claim_boundary": "Die Map belegt Aktivierungsbereitschaft und No-Secret-Kontrollpräsenz. Sie ist keine Produktivfreigabe für Alerts, Feeds oder API-Keys und erzeugt keinen neuen Domainreport-Befund."
    },
    "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",
                "python3 scripts/run-alert-dispatch.py --max 1"
            ],
            "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 grün: 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 für Audit-Dry-runs zugelassen.",
                "SAFERPAGE_ALERT_DISPATCH_APPROVED=yes ist erst nach dokumentierter Betreiberfreigabe gesetzt.",
                "Receiver prüft Idempotency-Key und optional HMAC-Signatur.",
                "Public-State zeigt keine Ziel-URLs, Tokens, Empfänger oder Rohpayloads."
            ],
            "stop_conditions": [
                "sent_count steigt ohne Approval-Record.",
                "Webhook-URL, Token oder Empfänger erscheinen in Public-State, Logs oder Exporten.",
                "Zielsystem erzeugt Duplikate trotz Idempotency-Key.",
                "Runner error_count ist größer 0."
            ],
            "operator_steps": [
                "Zielsystem-Verantwortlichkeit und Testkanal festlegen.",
                "Secrets in /etc/saferpage/alert-dispatch.env oder Secret Manager setzen.",
                "Dry-run ausführen und Runner-State prüfen.",
                "Receiver-Signatur und Dedupe prüfen.",
                "Freigabe setzen und nach erstem Lauf sent/error prüfen."
            ],
            "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",
                    "python3 scripts/run-alert-dispatch.py --max 1"
                ],
                "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 öffentlich zeigen; keine Secret-Werte, DSN, Ziel-URLs, Empfänger, 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 grün: 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 läuft 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 läuft ohne explizites Run-Gate.",
                "stored_observation_count steigt vor Storage-Freigabe.",
                "Launch-Board zeigt Runner-Fehler oder unerklärte externe Ausführungen."
            ],
            "operator_steps": [
                "Feed-Quellen und Zweck freigeben.",
                "Secrets nur serverseitig setzen.",
                "Storage-Migration und Preflight prüfen.",
                "Canary ohne externe Feed-Abfrage ausführen.",
                "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 öffentlich zeigen; keine Secret-Werte, DSN, Ziel-URLs, Empfänger, 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 2/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 prüfen.",
                "Kurzlebigen Admin-DSN nur in sicherer Shell setzen.",
                "Migration anwenden und Preflight erneut prüfen.",
                "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 öffentlich zeigen; keine Secret-Werte, DSN, Ziel-URLs, Empfänger, Roh-Keys, Authorization-Header, Rohpayloads oder Besucherlogs."
        }
    ],
    "operator_signoff_dossiers": [
        {
            "id": "signoff_delivery_targets_and_approval",
            "phase_id": "delivery_targets_and_approval",
            "approval_id": "approval_delivery_targets_and_approval",
            "label": "Alert-Zustellung freigeben",
            "status": "waiting_for_operator_inputs",
            "owner": "IT/Security",
            "current_blocker": "Externes Webhook/Slack/Teams-Ziel fehlt. SAFERPAGE_ALERT_DISPATCH_APPROVED ist nicht aktiv.",
            "decision_required": "Sichere Inputs, Betreiberfreigabe und Smoke-Evidence nachreichen.",
            "next_operator_step": "Zielsystem-Verantwortlichkeit und Testkanal festlegen.",
            "primary_url": "https://saferpage.de/integrationen/delivery-credential-preflight-json",
            "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",
                "python3 scripts/run-alert-dispatch.py --max 1"
            ],
            "acceptance_criteria": [
                "Alert-Delivery-Readiness-Smoke ist grün: 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 für Audit-Dry-runs zugelassen.",
                "SAFERPAGE_ALERT_DISPATCH_APPROVED=yes ist erst nach dokumentierter Betreiberfreigabe gesetzt.",
                "Receiver prüft Idempotency-Key und optional HMAC-Signatur.",
                "Public-State zeigt keine Ziel-URLs, Tokens, Empfänger oder Rohpayloads."
            ],
            "stop_conditions": [
                "sent_count steigt ohne Approval-Record.",
                "Webhook-URL, Token oder Empfänger erscheinen in Public-State, Logs oder Exporten.",
                "Zielsystem erzeugt Duplikate trotz Idempotency-Key.",
                "Runner error_count ist größer 0."
            ],
            "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"
            ],
            "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",
                    "python3 scripts/run-alert-dispatch.py --max 1"
                ],
                "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 öffentlich zeigen; keine Secret-Werte, DSN, Ziel-URLs, Empfänger, Roh-Keys, Authorization-Header, Rohpayloads oder Besucherlogs.",
            "no_secret_checklist": [
                "Public-JSON, CSV und Markdown enthalten nur Referenznamen, Status, Evidence-URLs, Kommandonamen und Kriterien.",
                "Keine Secret-Werte, DSN, API-Keys, Tokens, Zielsystem-URLs, Empfänger, Rohpayloads oder Besucherlogs im Export.",
                "Dry-run-/Deny-Smokes wurden vor Signoff referenziert und zeigen keine produktiven Nebenwirkungen.",
                "Rollback-Verantwortlichkeit, Review-Datum und Scope sind im Signoff-Record gesetzt.",
                "Produktive Claims bleiben blockiert, bis Betreiberfreigabe und phasenspezifische Gates vollständig sind."
            ],
            "claim_boundary": "Dieses Dossier beweist Readiness- und Freigabestatus, aber keine produktive Aktivierung. Live-Claims zu Alerts, Security-Feeds oder API-Keys sind erst nach dokumentiertem Betreiber-Signoff und erneuten Smokes zulässig."
        },
        {
            "id": "signoff_security_feed_credentials_and_storage",
            "phase_id": "security_feed_credentials_and_storage",
            "approval_id": "approval_security_feed_credentials_and_storage",
            "label": "Security-Feeds aktivieren",
            "status": "waiting_for_operator_inputs",
            "owner": "IT/Security + Datenschutz",
            "current_blocker": "URLhaus/Safe-Browsing-Credentials fehlen. SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED ist nicht aktiv.",
            "decision_required": "Sichere Inputs, Betreiberfreigabe und Smoke-Evidence nachreichen.",
            "next_operator_step": "Feed-Quellen und Zweck freigeben.",
            "primary_url": "https://saferpage.de/sicherheit/feed-credential-preflight-json",
            "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 grün: 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 läuft 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 läuft ohne explizites Run-Gate.",
                "stored_observation_count steigt vor Storage-Freigabe.",
                "Launch-Board zeigt Runner-Fehler oder unerklärte externe Ausführungen."
            ],
            "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"
            ],
            "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 öffentlich zeigen; keine Secret-Werte, DSN, Ziel-URLs, Empfänger, Roh-Keys, Authorization-Header, Rohpayloads oder Besucherlogs.",
            "no_secret_checklist": [
                "Public-JSON, CSV und Markdown enthalten nur Referenznamen, Status, Evidence-URLs, Kommandonamen und Kriterien.",
                "Keine Secret-Werte, DSN, API-Keys, Tokens, Zielsystem-URLs, Empfänger, Rohpayloads oder Besucherlogs im Export.",
                "Dry-run-/Deny-Smokes wurden vor Signoff referenziert und zeigen keine produktiven Nebenwirkungen.",
                "Rollback-Verantwortlichkeit, Review-Datum und Scope sind im Signoff-Record gesetzt.",
                "Produktive Claims bleiben blockiert, bis Betreiberfreigabe und phasenspezifische Gates vollständig sind."
            ],
            "claim_boundary": "Dieses Dossier beweist Readiness- und Freigabestatus, aber keine produktive Aktivierung. Live-Claims zu Alerts, Security-Feeds oder API-Keys sind erst nach dokumentiertem Betreiber-Signoff und erneuten Smokes zulässig."
        },
        {
            "id": "signoff_operator_api_key_readiness",
            "phase_id": "operator_api_key_readiness",
            "approval_id": "approval_operator_api_key_readiness",
            "label": "Operator-API-Key-Store freischalten",
            "status": "waiting_for_operator_inputs",
            "owner": "IT/Security",
            "current_blocker": "API-Access-Storage 2/2 Tabellen; produktive API-Key-Freigaben 0/7.",
            "decision_required": "Sichere Inputs, Betreiberfreigabe und Smoke-Evidence nachreichen.",
            "next_operator_step": "Migration-Preflight prüfen.",
            "primary_url": "https://saferpage.de/api-zugriff/key-readiness-json",
            "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."
            ],
            "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"
            ],
            "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 öffentlich zeigen; keine Secret-Werte, DSN, Ziel-URLs, Empfänger, Roh-Keys, Authorization-Header, Rohpayloads oder Besucherlogs.",
            "no_secret_checklist": [
                "Public-JSON, CSV und Markdown enthalten nur Referenznamen, Status, Evidence-URLs, Kommandonamen und Kriterien.",
                "Keine Secret-Werte, DSN, API-Keys, Tokens, Zielsystem-URLs, Empfänger, Rohpayloads oder Besucherlogs im Export.",
                "Dry-run-/Deny-Smokes wurden vor Signoff referenziert und zeigen keine produktiven Nebenwirkungen.",
                "Rollback-Verantwortlichkeit, Review-Datum und Scope sind im Signoff-Record gesetzt.",
                "Produktive Claims bleiben blockiert, bis Betreiberfreigabe und phasenspezifische Gates vollständig sind."
            ],
            "claim_boundary": "Dieses Dossier beweist Readiness- und Freigabestatus, aber keine produktive Aktivierung. Live-Claims zu Alerts, Security-Feeds oder API-Keys sind erst nach dokumentiertem Betreiber-Signoff und erneuten Smokes zulässig."
        }
    ],
    "operator_signoff_receipt_pack": [
        {
            "id": "receipt_delivery_targets_and_approval",
            "phase_id": "delivery_targets_and_approval",
            "claim_id": "alert_delivery_live_claim",
            "label": "Alert-Zustellung freigeben",
            "status": "awaiting_operator_signoff",
            "owner": "IT/Security",
            "private_inputs_required": [
                "SAFERPAGE_ALERT_DISPATCH_APPROVED",
                "SAFERPAGE_WEBHOOK_URL",
                "SAFERPAGE_WEBHOOK_SECRET",
                "SAFERPAGE_SLACK_WEBHOOK_URL",
                "SAFERPAGE_TEAMS_WEBHOOK_URL",
                "SAFERPAGE_LOCAL_FILE_SINK_PATH"
            ],
            "public_receipt_fields": [
                "receipt_id",
                "phase_id",
                "claim_id",
                "status",
                "owner_role",
                "scope",
                "evidence_urls",
                "smoke_result_refs",
                "rollback_owner_role",
                "expires_or_review_at",
                "claim_boundary"
            ],
            "public_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_command_refs": [
                "scripts/run-alert-delivery-readiness-smoke.sh",
                "scripts/run-alert-dispatch-dry-run-smoke.sh",
                "python3 scripts/run-alert-dispatch.py --max 1"
            ],
            "verification_checks": [
                "Alert-Delivery-Readiness-Smoke ist grün: 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 für Audit-Dry-runs zugelassen.",
                "SAFERPAGE_ALERT_DISPATCH_APPROVED=yes ist erst nach dokumentierter Betreiberfreigabe gesetzt.",
                "Receiver prüft Idempotency-Key und optional HMAC-Signatur.",
                "Public-State zeigt keine Ziel-URLs, Tokens, Empfänger oder Rohpayloads.",
                "Competitive-Evidence-Health ist grün und contract_failed_count ist 0.",
                "Passende Readiness-/Preflight-Smokes sind referenziert und enthalten keine Secret-Werte.",
                "Public Receipt enthält nur erlaubte Felder und keine Ziel-URL-, Empfänger- oder Rohpayload-Werte."
            ],
            "no_secret_attestation": [
                "Public-JSON, CSV und Markdown enthalten nur Referenznamen, Status, Evidence-URLs, Kommandonamen und Kriterien.",
                "Keine Secret-Werte, DSN, API-Keys, Tokens, Zielsystem-URLs, Empfänger, Rohpayloads oder Besucherlogs im Export.",
                "Dry-run-/Deny-Smokes wurden vor Signoff referenziert und zeigen keine produktiven Nebenwirkungen.",
                "Rollback-Verantwortlichkeit, Review-Datum und Scope sind im Signoff-Record gesetzt.",
                "Produktive Claims bleiben blockiert, bis Betreiberfreigabe und phasenspezifische Gates vollständig sind.",
                "Kein Secret-Wert, Token, API-Key, HMAC, Passwort oder DSN im Review-Datensatz.",
                "Keine externen Ziel-URLs, Empfänger, Rohpayloads oder privaten Visitor-/Kundendaten im Public Export.",
                "Live-Claim bleibt blockiert, bis Smoke, Signoff-Record, Rollback-Verantwortlichkeit und Review-Datum dokumentiert sind.",
                "Review darf nur den öffentlichen Evidence-Link, Status und Betreiberinput-Referenznamen verwenden.",
                "Receipt darf keine produktiven Secret-Werte, DSN, API-Keys, Tokens, Webhook-Ziele oder Empfänger enthalten.",
                "Personenbezogene Besucherlogs und Rohpayloads bleiben ausgeschlossen."
            ],
            "activation_conditions": [
                "Scope und Verantwortlichkeit im privaten Signoff-System bestätigen.",
                "Evidence-URLs und Smoke-Referenzen gegen den aktuellen Public-State prüfen.",
                "Rollback-Verantwortlichkeit, Review-Datum und Ablaufdatum setzen.",
                "Erst nach erfolgreichem No-Secret-Check das betroffene Gate kontrolliert aktivieren."
            ],
            "stop_conditions": [
                "sent_count steigt ohne Approval-Record.",
                "Webhook-URL, Token oder Empfänger erscheinen in Public-State, Logs oder Exporten.",
                "Zielsystem erzeugt Duplikate trotz Idempotency-Key.",
                "Runner error_count ist größer 0."
            ],
            "claim_boundary": "Dieses Dossier beweist Readiness- und Freigabestatus, aber keine produktive Aktivierung. Live-Claims zu Alerts, Security-Feeds oder API-Keys sind erst nach dokumentiertem Betreiber-Signoff und erneuten Smokes zulässig.",
            "public_export_policy": "Public Receipt nur mit IDs, Rollen, Status, Scope, Evidence-URLs, Smoke-Referenzen, Rollback-Rolle, Review-Datum und Claim-Grenze. Keine Secret-Werte, Ziel-URLs, Empfänger, Rohpayloads oder Besucherlogs."
        },
        {
            "id": "receipt_security_feed_credentials_and_storage",
            "phase_id": "security_feed_credentials_and_storage",
            "claim_id": "security_feed_live_claim",
            "label": "Security-Feeds aktivieren",
            "status": "awaiting_operator_signoff",
            "owner": "IT/Security + Datenschutz",
            "private_inputs_required": [
                "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"
            ],
            "public_receipt_fields": [
                "receipt_id",
                "phase_id",
                "claim_id",
                "status",
                "owner_role",
                "scope",
                "evidence_urls",
                "smoke_result_refs",
                "rollback_owner_role",
                "expires_or_review_at",
                "claim_boundary"
            ],
            "public_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_command_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"
            ],
            "verification_checks": [
                "Security-Feed-Readiness-Smoke ist grün: 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 läuft vor echten Feed-Treffern erfolgreich.",
                "Live-Probe und Runner-State zeigen keine Feed-Rohpayloads, Malware-Samples oder personenbezogenen Logs.",
                "Competitive-Evidence-Health ist grün und contract_failed_count ist 0.",
                "Passende Readiness-/Preflight-Smokes sind referenziert und enthalten keine Secret-Werte.",
                "Public Receipt enthält nur erlaubte Felder und keine Ziel-URL-, Empfänger- oder Rohpayload-Werte."
            ],
            "no_secret_attestation": [
                "Public-JSON, CSV und Markdown enthalten nur Referenznamen, Status, Evidence-URLs, Kommandonamen und Kriterien.",
                "Keine Secret-Werte, DSN, API-Keys, Tokens, Zielsystem-URLs, Empfänger, Rohpayloads oder Besucherlogs im Export.",
                "Dry-run-/Deny-Smokes wurden vor Signoff referenziert und zeigen keine produktiven Nebenwirkungen.",
                "Rollback-Verantwortlichkeit, Review-Datum und Scope sind im Signoff-Record gesetzt.",
                "Produktive Claims bleiben blockiert, bis Betreiberfreigabe und phasenspezifische Gates vollständig sind.",
                "Kein Secret-Wert, Token, API-Key, HMAC, Passwort oder DSN im Review-Datensatz.",
                "Keine externen Ziel-URLs, Empfänger, Rohpayloads oder privaten Visitor-/Kundendaten im Public Export.",
                "Live-Claim bleibt blockiert, bis Smoke, Signoff-Record, Rollback-Verantwortlichkeit und Review-Datum dokumentiert sind.",
                "Review darf nur den öffentlichen Evidence-Link, Status und Betreiberinput-Referenznamen verwenden.",
                "Receipt darf keine produktiven Secret-Werte, DSN, API-Keys, Tokens, Webhook-Ziele oder Empfänger enthalten.",
                "Personenbezogene Besucherlogs und Rohpayloads bleiben ausgeschlossen."
            ],
            "activation_conditions": [
                "Scope und Verantwortlichkeit im privaten Signoff-System bestätigen.",
                "Evidence-URLs und Smoke-Referenzen gegen den aktuellen Public-State prüfen.",
                "Rollback-Verantwortlichkeit, Review-Datum und Ablaufdatum setzen.",
                "Erst nach erfolgreichem No-Secret-Check das betroffene Gate kontrolliert aktivieren."
            ],
            "stop_conditions": [
                "Secret-Wert, API-Key, Rohpayload oder personenbezogene Logzeile erscheint in Public-State.",
                "Externe Feed-Abfrage läuft ohne explizites Run-Gate.",
                "stored_observation_count steigt vor Storage-Freigabe.",
                "Launch-Board zeigt Runner-Fehler oder unerklärte externe Ausführungen."
            ],
            "claim_boundary": "Dieses Dossier beweist Readiness- und Freigabestatus, aber keine produktive Aktivierung. Live-Claims zu Alerts, Security-Feeds oder API-Keys sind erst nach dokumentiertem Betreiber-Signoff und erneuten Smokes zulässig.",
            "public_export_policy": "Public Receipt nur mit IDs, Rollen, Status, Scope, Evidence-URLs, Smoke-Referenzen, Rollback-Rolle, Review-Datum und Claim-Grenze. Keine Secret-Werte, Ziel-URLs, Empfänger, Rohpayloads oder Besucherlogs."
        },
        {
            "id": "receipt_operator_api_key_readiness",
            "phase_id": "operator_api_key_readiness",
            "claim_id": "api_key_live_claim",
            "label": "Operator-API-Key-Store freischalten",
            "status": "awaiting_operator_signoff",
            "owner": "IT/Security",
            "private_inputs_required": [
                "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"
            ],
            "public_receipt_fields": [
                "receipt_id",
                "phase_id",
                "claim_id",
                "status",
                "owner_role",
                "scope",
                "evidence_urls",
                "smoke_result_refs",
                "rollback_owner_role",
                "expires_or_review_at",
                "claim_boundary"
            ],
            "public_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",
                "https://saferpage.de/evidence/api-key-readiness-smoke.json"
            ],
            "safe_command_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"
            ],
            "verification_checks": [
                "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.",
                "Competitive-Evidence-Health ist grün und contract_failed_count ist 0.",
                "Passende Readiness-/Preflight-Smokes sind referenziert und enthalten keine Secret-Werte.",
                "Public Receipt enthält nur erlaubte Felder und keine Ziel-URL-, Empfänger- oder Rohpayload-Werte."
            ],
            "no_secret_attestation": [
                "Public-JSON, CSV und Markdown enthalten nur Referenznamen, Status, Evidence-URLs, Kommandonamen und Kriterien.",
                "Keine Secret-Werte, DSN, API-Keys, Tokens, Zielsystem-URLs, Empfänger, Rohpayloads oder Besucherlogs im Export.",
                "Dry-run-/Deny-Smokes wurden vor Signoff referenziert und zeigen keine produktiven Nebenwirkungen.",
                "Rollback-Verantwortlichkeit, Review-Datum und Scope sind im Signoff-Record gesetzt.",
                "Produktive Claims bleiben blockiert, bis Betreiberfreigabe und phasenspezifische Gates vollständig sind.",
                "Kein Secret-Wert, Token, API-Key, HMAC, Passwort oder DSN im Review-Datensatz.",
                "Keine externen Ziel-URLs, Empfänger, Rohpayloads oder privaten Visitor-/Kundendaten im Public Export.",
                "Live-Claim bleibt blockiert, bis Smoke, Signoff-Record, Rollback-Verantwortlichkeit und Review-Datum dokumentiert sind.",
                "Review darf nur den öffentlichen Evidence-Link, Status und Betreiberinput-Referenznamen verwenden.",
                "Receipt darf keine produktiven Secret-Werte, DSN, API-Keys, Tokens, Webhook-Ziele oder Empfänger enthalten.",
                "Personenbezogene Besucherlogs und Rohpayloads bleiben ausgeschlossen."
            ],
            "activation_conditions": [
                "Scope und Verantwortlichkeit im privaten Signoff-System bestätigen.",
                "Evidence-URLs und Smoke-Referenzen gegen den aktuellen Public-State prüfen.",
                "Rollback-Verantwortlichkeit, Review-Datum und Ablaufdatum setzen.",
                "Erst nach erfolgreichem No-Secret-Check das betroffene Gate kontrolliert aktivieren."
            ],
            "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."
            ],
            "claim_boundary": "Dieses Dossier beweist Readiness- und Freigabestatus, aber keine produktive Aktivierung. Live-Claims zu Alerts, Security-Feeds oder API-Keys sind erst nach dokumentiertem Betreiber-Signoff und erneuten Smokes zulässig.",
            "public_export_policy": "Public Receipt nur mit IDs, Rollen, Status, Scope, Evidence-URLs, Smoke-Referenzen, Rollback-Rolle, Review-Datum und Claim-Grenze. Keine Secret-Werte, Ziel-URLs, Empfänger, Rohpayloads oder Besucherlogs."
        }
    ],
    "operator_claim_release_board": [
        {
            "id": "public_evidence_readiness",
            "label": "Öffentliche Evidence und Readiness zeigen",
            "status": "public_ready",
            "allowed_claim": "SaferPage kann öffentliche Readiness-, Evidence- und No-Secret-Smoke-Nachweise zeigen.",
            "do_not_claim": "Nicht behaupten, dass damit Secrets, Zustellung, externe Feeds oder API-Key-Ausgabe produktiv aktiv sind.",
            "required_operator_input": "Keine privaten Inputs erforderlich; nur grüne öffentliche Smokes und Evidence-Hub prüfen.",
            "claim_boundary": "Readiness ist ein öffentlicher Nachweisraum, keine Rechtsberatung, kein Zertifikat und keine Produktivfreigabe.",
            "evidence_url": "https://saferpage.de/evidence/competitive-evidence-health-smoke.json",
            "stop_conditions": [
                "No-Secret-Smokes werden rot.",
                "Competitive-Evidence-Health meldet Contract-Fehler.",
                "Public-Export enthält Secret-, Empfänger-, Ziel-URL- oder Rohpayload-Hinweise."
            ]
        },
        {
            "id": "alert_delivery_live_claim",
            "label": "Automatische Alert-Zustellung als live verkaufen",
            "status": "blocked_live",
            "allowed_claim": "Alert-Delivery nur als Blueprint und Abnahmepfad zeigen.",
            "do_not_claim": "Keine Aussage wie automatische Benachrichtigungen sind live, solange Zielsystem, Approval und Nachlauf nicht freigegeben sind.",
            "required_operator_input": "Zielsystem, Receiver-Test, SAFERPAGE_ALERT_DISPATCH_APPROVED, Smoke-Referenz und Signoff-Record.",
            "claim_boundary": "Delivery-Claims bleiben blockiert, bis Betreiberfreigabe, Dry-run, Receiver-Validierung und Stop-Bedingungen erfüllt sind.",
            "evidence_url": "https://saferpage.de/evidence/alert-delivery-readiness-smoke.json",
            "stop_conditions": [
                "sent_count steigt ohne Approval-Record.",
                "Webhook-URL, Token oder Empfänger erscheinen in Public-State, Logs oder Exporten.",
                "Zielsystem erzeugt Duplikate trotz Idempotency-Key.",
                "Runner error_count ist größer 0."
            ]
        },
        {
            "id": "security_feed_live_claim",
            "label": "Security-Feeds und tägliche Sicherheitschecks als live verkaufen",
            "status": "blocked_live",
            "allowed_claim": "Security-Feeds nur als Launch-Board, Storage-Gate und Freigabepfad zeigen.",
            "do_not_claim": "Keine Aussage wie tägliche externe Feed-Prüfung ist live, solange Credentials, Storage, Retention und Freigabe fehlen.",
            "required_operator_input": "Feed-Credentials, Storage-Migration, Retention-/DPIA-Review, SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED und Canary.",
            "claim_boundary": "Feed-Claims bleiben blockiert, bis Secrets, DB-Artefakte, Storage-Freigabe und No-Secret-Runner-State belegt sind.",
            "evidence_url": "https://saferpage.de/evidence/security-feed-readiness-smoke.json",
            "stop_conditions": [
                "Secret-Wert, API-Key, Rohpayload oder personenbezogene Logzeile erscheint in Public-State.",
                "Externe Feed-Abfrage läuft ohne explizites Run-Gate.",
                "stored_observation_count steigt vor Storage-Freigabe.",
                "Launch-Board zeigt Runner-Fehler oder unerklärte externe Ausführungen."
            ]
        },
        {
            "id": "api_key_live_claim",
            "label": "API-Key-Ausgabe und Write-Zugriffe als live verkaufen",
            "status": "blocked_live",
            "allowed_claim": "API-Zugriff nur als geschütztes Runtime-/Migration-Blueprint zeigen.",
            "do_not_claim": "Keine produktive API-Key-Ausgabe, kein Write-API-Versprechen und kein Partner-API-Claim ohne Store, Audit, HMAC und Freigabe.",
            "required_operator_input": "DB-Verantwortlichkeitsmigration, API-Key-Pepper, Domain-Claim, Write-HMAC, Deny/Allow-Smokes und Revocation-Test.",
            "claim_boundary": "API-Claims bleiben blockiert, bis Storage-Artefakte, alle sieben Gates, HMAC-Fixture und Audit-Log grün sind.",
            "evidence_url": "https://saferpage.de/evidence/api-key-readiness-smoke.json",
            "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_claim_review_lane": [
        {
            "id": "review_alert_delivery_live_claim",
            "claim_id": "alert_delivery_live_claim",
            "label": "Automatische Alert-Zustellung als live verkaufen",
            "status": "review_ready",
            "phase_id": "delivery_targets_and_approval",
            "owner": "IT/Security",
            "review_question": "Darf dieser Live-Claim nach Betreiber-Signoff öffentlich verwendet werden, ohne Produktivstatus oder Datenschutzumfang zu überziehen?",
            "review_scope": "Delivery-Claims bleiben blockiert, bis Betreiberfreigabe, Dry-run, Receiver-Validierung und Stop-Bedingungen erfüllt sind.",
            "allowed_after_review": "Alert-Delivery nur als Blueprint und Abnahmepfad zeigen.",
            "do_not_claim": "Keine Aussage wie automatische Benachrichtigungen sind live, solange Zielsystem, Approval und Nachlauf nicht freigegeben sind.",
            "required_operator_input": "Zielsystem, Receiver-Test, SAFERPAGE_ALERT_DISPATCH_APPROVED, Smoke-Referenz und Signoff-Record.",
            "evidence_urls": [
                "https://saferpage.de/evidence/alert-delivery-readiness-smoke.json",
                "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"
            ],
            "acceptance_criteria": [
                "Alert-Delivery-Readiness-Smoke ist grün: 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 für Audit-Dry-runs zugelassen.",
                "SAFERPAGE_ALERT_DISPATCH_APPROVED=yes ist erst nach dokumentierter Betreiberfreigabe gesetzt.",
                "Receiver prüft Idempotency-Key und optional HMAC-Signatur.",
                "Public-State zeigt keine Ziel-URLs, Tokens, Empfänger oder Rohpayloads."
            ],
            "stop_conditions": [
                "sent_count steigt ohne Approval-Record.",
                "Webhook-URL, Token oder Empfänger erscheinen in Public-State, Logs oder Exporten.",
                "Zielsystem erzeugt Duplikate trotz Idempotency-Key.",
                "Runner error_count ist größer 0."
            ],
            "no_secret_checklist": [
                "Kein Secret-Wert, Token, API-Key, HMAC, Passwort oder DSN im Review-Datensatz.",
                "Keine externen Ziel-URLs, Empfänger, Rohpayloads oder privaten Visitor-/Kundendaten im Public Export.",
                "Live-Claim bleibt blockiert, bis Smoke, Signoff-Record, Rollback-Verantwortlichkeit und Review-Datum dokumentiert sind.",
                "Review darf nur den öffentlichen Evidence-Link, Status und Betreiberinput-Referenznamen verwenden."
            ]
        },
        {
            "id": "review_security_feed_live_claim",
            "claim_id": "security_feed_live_claim",
            "label": "Security-Feeds und tägliche Sicherheitschecks als live verkaufen",
            "status": "review_ready",
            "phase_id": "security_feed_credentials_and_storage",
            "owner": "IT/Security + Datenschutz",
            "review_question": "Darf dieser Live-Claim nach Betreiber-Signoff öffentlich verwendet werden, ohne Produktivstatus oder Datenschutzumfang zu überziehen?",
            "review_scope": "Feed-Claims bleiben blockiert, bis Secrets, DB-Artefakte, Storage-Freigabe und No-Secret-Runner-State belegt sind.",
            "allowed_after_review": "Security-Feeds nur als Launch-Board, Storage-Gate und Freigabepfad zeigen.",
            "do_not_claim": "Keine Aussage wie tägliche externe Feed-Prüfung ist live, solange Credentials, Storage, Retention und Freigabe fehlen.",
            "required_operator_input": "Feed-Credentials, Storage-Migration, Retention-/DPIA-Review, SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED und Canary.",
            "evidence_urls": [
                "https://saferpage.de/evidence/security-feed-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/sicherheit/feed-launch-board-json"
            ],
            "acceptance_criteria": [
                "Security-Feed-Readiness-Smoke ist grün: 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 läuft 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 läuft ohne explizites Run-Gate.",
                "stored_observation_count steigt vor Storage-Freigabe.",
                "Launch-Board zeigt Runner-Fehler oder unerklärte externe Ausführungen."
            ],
            "no_secret_checklist": [
                "Kein Secret-Wert, Token, API-Key, HMAC, Passwort oder DSN im Review-Datensatz.",
                "Keine externen Ziel-URLs, Empfänger, Rohpayloads oder privaten Visitor-/Kundendaten im Public Export.",
                "Live-Claim bleibt blockiert, bis Smoke, Signoff-Record, Rollback-Verantwortlichkeit und Review-Datum dokumentiert sind.",
                "Review darf nur den öffentlichen Evidence-Link, Status und Betreiberinput-Referenznamen verwenden."
            ]
        },
        {
            "id": "review_api_key_live_claim",
            "claim_id": "api_key_live_claim",
            "label": "API-Key-Ausgabe und Write-Zugriffe als live verkaufen",
            "status": "review_ready",
            "phase_id": "operator_api_key_readiness",
            "owner": "IT/Security",
            "review_question": "Darf dieser Live-Claim nach Betreiber-Signoff öffentlich verwendet werden, ohne Produktivstatus oder Datenschutzumfang zu überziehen?",
            "review_scope": "API-Claims bleiben blockiert, bis Storage-Artefakte, alle sieben Gates, HMAC-Fixture und Audit-Log grün sind.",
            "allowed_after_review": "API-Zugriff nur als geschütztes Runtime-/Migration-Blueprint zeigen.",
            "do_not_claim": "Keine produktive API-Key-Ausgabe, kein Write-API-Versprechen und kein Partner-API-Claim ohne Store, Audit, HMAC und Freigabe.",
            "required_operator_input": "DB-Verantwortlichkeitsmigration, API-Key-Pepper, Domain-Claim, Write-HMAC, Deny/Allow-Smokes und Revocation-Test.",
            "evidence_urls": [
                "https://saferpage.de/evidence/api-key-readiness-smoke.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"
            ],
            "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."
            ],
            "no_secret_checklist": [
                "Kein Secret-Wert, Token, API-Key, HMAC, Passwort oder DSN im Review-Datensatz.",
                "Keine externen Ziel-URLs, Empfänger, Rohpayloads oder privaten Visitor-/Kundendaten im Public Export.",
                "Live-Claim bleibt blockiert, bis Smoke, Signoff-Record, Rollback-Verantwortlichkeit und Review-Datum dokumentiert sind.",
                "Review darf nur den öffentlichen Evidence-Link, Status und Betreiberinput-Referenznamen verwenden."
            ]
        }
    ],
    "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",
        "python3 scripts/run-alert-dispatch.py --max 1",
        "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 veröffentlicht keine Secret-Werte, Ziel-URLs, Empfänger, Rohpayloads oder Besucherlogs.",
    "operator_decision_summary": [
        {
            "id": "public_ready_claims",
            "label": "Öffentlich nutzbare Claims",
            "status": "public_ready",
            "owner": "Produkt/Sales",
            "evidence": "1/4 Claim(s) sind public-ready; Evidence-Links: 4.",
            "next_step": "Nur die erlaubten Readiness-/Evidence-Formulierungen aus der Claim-Freigabeampel verwenden.",
            "boundary": "Kein Live-Alerting, keine aktiven Security-Feeds und keine produktive API-Key-Ausgabe behaupten.",
            "url": "https://saferpage.de/betreiber/go-live-json"
        },
        {
            "id": "blocked_live_claims",
            "label": "Blocked-live Claims",
            "status": "blocked_live",
            "owner": "Produkt/Management",
            "evidence": "3 Live-Claim(s) bleiben blockiert; Stop-Bedingungen: 15.",
            "next_step": "Blockierte Claims erst nach Smoke, Betreiberfreigabe, Rollback-Verantwortlichkeit und No-Secret-Prüfung aktivieren.",
            "boundary": "Review-ready ist keine Produktivfreigabe.",
            "url": "https://saferpage.de/vergleich/parity-readiness-json"
        },
        {
            "id": "operator_signoff",
            "label": "Betreiberfreigaben",
            "status": "waiting_for_operator_signoff",
            "owner": "Betreiber/Management",
            "evidence": "3/3 Signoff-Dossiers warten; Evidence-URLs: 16.",
            "next_step": "Freigabe mit Scope, Ablaufdatum, Evidence-Referenzen, Smoke-Resultaten und Rollback-Verantwortlichkeit dokumentieren.",
            "boundary": "Keine Secrets, Empfänger, Ziel-URLs oder privaten Betreiberinputs in öffentliche Evidence schreiben.",
            "url": "https://saferpage.de/betreiber/go-live-json"
        },
        {
            "id": "no_secret_smoke_coverage",
            "label": "No-Secret-Smoke-Coverage",
            "status": "ok",
            "owner": "IT/Security/Produkt",
            "evidence": "7/7 Smokes grün, 0 Fehler, 4 erwartete Gates.",
            "next_step": "Vor jedem Go-live die betroffenen Smoke-JSONs erneut ausführen und archivieren.",
            "boundary": "Grüne Smokes belegen öffentliche Kontrolle, aber ersetzen keine echten Credentials oder Betreiberfreigaben.",
            "url": "https://saferpage.de/evidence-hub-json"
        },
        {
            "id": "competitive_evidence_health",
            "label": "Wettbewerbs-/Evidence-Vertrag",
            "status": "ok",
            "owner": "Produkt/QA",
            "evidence": "85/85 Routen, 309 Contracts, 0 Contract-Fehler.",
            "next_step": "Bei jeder neuen Wettbewerbsbehauptung zuerst Evidence-Health und Release-Gate-Details prüfen.",
            "boundary": "Kein Anbieter-Ranking, keine Funktionsparität und keine Live-Freigabe ohne belegte Quelle und Gate.",
            "url": "https://saferpage.de/evidence/competitive-evidence-health-smoke.json"
        }
    ]
}
