{
    "schema": "https://saferpage.de/schemas/security-feed-approval-dossier.v1",
    "generated_at": "2026-06-09T21:32:53+00:00",
    "domain": "anrufer.info",
    "approval_ready": false,
    "status": "approval_required",
    "summary": "anrufer.info: Security-Feed-Dossier ist vorbereitet; 5 blockierende Betreiberaktion(en) bleiben offen.",
    "metrics": {
        "signoff_count": 6,
        "ready_signoff_count": 1,
        "required_signoff_count": 5,
        "blocked_action_count": 5,
        "launch_gate_count": 7,
        "blocked_launch_gate_count": 5,
        "missing_database_artifact_count": 11,
        "runner_error_count": 0
    },
    "signoffs": [
        {
            "id": "db_owner_schema",
            "owner": "DB-Owner",
            "status": "required",
            "decision": "Security-Feed-Storage-Schema produktiv freigeben.",
            "evidence": "Security-Feed-Storage ist noch nicht schreibbereit: 11 Datenbank-Artefakt(e) fehlen oder die Serverfreigabe ist nicht aktiv.",
            "required_evidence_url": "https://saferpage.de/sicherheit/feed-storage-readiness-json"
        },
        {
            "id": "privacy_retention",
            "owner": "Betreiber/Datenschutz",
            "status": "required",
            "decision": "Retention, Reviewstatus und Publikationsregeln fuer Feed-Observations freigeben.",
            "evidence": "Clean-Momentaufnahmen 30 Tage, Treffer mit Review/Audit 365 Tage, inconclusive 14 Tage.",
            "required_evidence_url": "https://saferpage.de/sicherheit/feed-storage-readiness-json"
        },
        {
            "id": "feed_credentials",
            "owner": "IT/Security",
            "status": "required",
            "decision": "Produktive Feed-Credentials serverseitig setzen und Rotation dokumentieren.",
            "evidence": "Secret-Werte werden nicht exportiert; nur Present/Missing-Status ist oeffentlich.",
            "required_evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json"
        },
        {
            "id": "delivery_signature",
            "owner": "IT/Security",
            "status": "required",
            "decision": "Webhook-/Operator-Delivery nur signiert aktivieren.",
            "evidence": "HMAC-Secret muss serverseitig vorhanden sein; Dry-Run bleibt ohne Secret blockiert.",
            "required_evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json"
        },
        {
            "id": "webbetrieb_runner",
            "owner": "Webbetrieb",
            "status": "ready",
            "decision": "systemd Runner im Daily-Betrieb ueberwachen und Guardrails beibehalten.",
            "evidence": "Security-Feed-Runner: 50 Domain(s) geprüft, 0 aktivierungsbereit, 0 externe Feed-Run(s), 0 Observation(s) gespeichert, 37 durch Gates blockiert, 13 ohne Reportseite, 0 technische Fehler.",
            "required_evidence_url": "https://saferpage.de/sicherheit/feed-runner-json"
        },
        {
            "id": "program_go_live",
            "owner": "Programm-Owner",
            "status": "required",
            "decision": "Security-Feed-Go-Live erst nach allen Gates freigeben.",
            "evidence": "anrufer.info: Security-Feed-Launch ist blockiert; 5/7 Gate(s) offen.",
            "required_evidence_url": "https://saferpage.de/sicherheit/feed-launch-board-json"
        }
    ],
    "blocked_actions": [
        {
            "gate": "feed_credentials",
            "owner": "IT/Security",
            "action": "SAFERPAGE_URLHAUS_AUTH_KEY und SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY serverseitig setzen und Rotation dokumentieren.",
            "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json"
        },
        {
            "gate": "storage_schema",
            "owner": "DB-Owner",
            "action": "Migration Package aus Storage-Readiness anwenden und Smoke-Tests ausführen.",
            "evidence_url": "https://saferpage.de/sicherheit/feed-storage-readiness-json"
        },
        {
            "gate": "storage_approval",
            "owner": "Betreiber/Datenschutz",
            "action": "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes erst nach Retention-, Review- und Alert-Routing-Freigabe setzen.",
            "evidence_url": "https://saferpage.de/sicherheit/feed-storage-readiness-json"
        },
        {
            "gate": "delivery_signature",
            "owner": "IT/Security",
            "action": "SAFERPAGE_WEBHOOK_SECRET oder SAFERPAGE_OPERATOR_WEBHOOK_SECRET setzen und HMAC-Dry-Run dokumentieren.",
            "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json"
        },
        {
            "gate": "activation_ready",
            "owner": "Programm-Owner",
            "action": "Alle blockierten Activation-Gates nacheinander schließen und danach Einzeltest ausführen.",
            "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json"
        }
    ],
    "go_no_go_decision": {
        "recommendation": "no_go",
        "decision_label": "No-Go bis offene Gates geschlossen sind",
        "reason": "5 Signoff(s) und 5 blockierende Aktion(en) sind offen.",
        "required_before_go_live": [
            {
                "id": "db_owner_schema",
                "owner": "DB-Owner",
                "decision": "Security-Feed-Storage-Schema produktiv freigeben.",
                "evidence_url": "https://saferpage.de/sicherheit/feed-storage-readiness-json"
            },
            {
                "id": "privacy_retention",
                "owner": "Betreiber/Datenschutz",
                "decision": "Retention, Reviewstatus und Publikationsregeln fuer Feed-Observations freigeben.",
                "evidence_url": "https://saferpage.de/sicherheit/feed-storage-readiness-json"
            },
            {
                "id": "feed_credentials",
                "owner": "IT/Security",
                "decision": "Produktive Feed-Credentials serverseitig setzen und Rotation dokumentieren.",
                "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json"
            },
            {
                "id": "delivery_signature",
                "owner": "IT/Security",
                "decision": "Webhook-/Operator-Delivery nur signiert aktivieren.",
                "evidence_url": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json"
            },
            {
                "id": "program_go_live",
                "owner": "Programm-Owner",
                "decision": "Security-Feed-Go-Live erst nach allen Gates freigeben.",
                "evidence_url": "https://saferpage.de/sicherheit/feed-launch-board-json"
            }
        ],
        "acceptance_criteria": [
            "Launch-Board status=ready und blocked_gate_count=0.",
            "Storage-Readiness zeigt Tabellen/Indizes/Trigger ready und Storage-Freigabe aktiv.",
            "Secret-Readiness zeigt Feed- und Delivery-Secrets nur als Present/Missing, nie als Wert.",
            "Runner-State zeigt kontrollierten Erstlauf ohne Secret-Werte, Rohpayloads oder ungeprüfte öffentliche Treffer.",
            "Security-Alerts-Delivery-Dry-Run ist signiert und Idempotency-Key ist dokumentiert.",
            "Decision Record ist von DB-Owner, Datenschutz, IT/Security, Webbetrieb und Programm-Owner freigegeben."
        ],
        "do_not_start_if": [
            "Produktive Feed-Credentials fehlen oder Rotation ist nicht dokumentiert.",
            "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED ist ohne Betreiberentscheidung aktiv.",
            "Storage-Migration-Hash weicht vom Dossier ab.",
            "Delivery-HMAC fehlt oder Testpayload ist nicht verifizierbar.",
            "Runner speichert oder veroeffentlicht Treffer vor Review."
        ]
    },
    "evidence_manifest": [
        {
            "id": "launch_board",
            "label": "Launch-Board",
            "url": "https://saferpage.de/sicherheit/feed-launch-board-json",
            "status": "blocked",
            "summary": "anrufer.info: Security-Feed-Launch ist blockiert; 5/7 Gate(s) offen."
        },
        {
            "id": "storage_readiness",
            "label": "Storage-Readiness",
            "url": "https://saferpage.de/sicherheit/feed-storage-readiness-json",
            "status": "blocked",
            "summary": "Security-Feed-Storage ist noch nicht schreibbereit: 11 Datenbank-Artefakt(e) fehlen oder die Serverfreigabe ist nicht aktiv."
        },
        {
            "id": "storage_migration_sql",
            "label": "Dedizierte Storage-SQL-Migration",
            "url": "https://saferpage.de/sicherheit/feed-storage-migration.sql",
            "status": "hash_available",
            "summary": "SHA-256 306a569bdf0d59054861ddc8ddfcf0d09a825f097f3d1dbe88993e481f048314; Bytes 3885"
        },
        {
            "id": "runner_state",
            "label": "systemd Runner-State",
            "url": "https://saferpage.de/sicherheit/feed-runner-json",
            "status": "available",
            "summary": "Security-Feed-Runner: 50 Domain(s) geprüft, 0 aktivierungsbereit, 0 externe Feed-Run(s), 0 Observation(s) gespeichert, 37 durch Gates blockiert, 13 ohne Reportseite, 0 technische Fehler."
        },
        {
            "id": "activation_pack",
            "label": "Feed-Aktivierung",
            "url": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json",
            "status": "blocked",
            "summary": "Credential-, Storage-, Delivery-, Runner- und Review-Gates fuer kontrollierte Aktivierung."
        }
    ],
    "change_plan": [
        {
            "phase": "1. Migration",
            "owner": "DB-Owner",
            "action": "Dedizierte DDL aus infra/postgres/migrations/security-feed-storage.sql mit autorisierter Rolle anwenden.",
            "acceptance": "Storage-Readiness meldet 3/3 Tabellen, 6/6 Indizes und 2/2 Trigger ready."
        },
        {
            "phase": "2. Secrets",
            "owner": "IT/Security",
            "action": "Feed- und Delivery-Secrets serverseitig setzen; Werte nie in Exporten, Tickets oder Logs ablegen.",
            "acceptance": "Secret-Readiness und Activation-Gate melden keine fehlenden Secret-Referenzen."
        },
        {
            "phase": "3. Betreiberfreigabe",
            "owner": "Betreiber/Datenschutz",
            "action": "Retention, Review, Publish-Entscheidung, Alert-Routing und Incident-Pfad freigeben.",
            "acceptance": "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes erst nach dokumentierter Entscheidung aktiv."
        },
        {
            "phase": "4. Kontrollierter Erstlauf",
            "owner": "Webbetrieb",
            "action": "Runner einmal manuell starten, danach Launch-Board und Runner-State pruefen.",
            "acceptance": "Keine Secret-Werte, keine Rohpayloads, keine ungeprueften oeffentlichen Treffer; gespeicherte Observations passen zu aktivierungsbereiten Domains."
        }
    ],
    "risk_register": [
        {
            "id": "raw_payload_leak",
            "risk": "Feed-Rohpayload oder Secret landet in oeffentlichem Export.",
            "control": "Forbidden-Fields-Vertrag, No-Secret-Export, HMAC nur als Status.",
            "status": "kontrolliert durch Design"
        },
        {
            "id": "false_positive_publication",
            "risk": "Blacklist-Treffer wird ohne Review oeffentlich sichtbar.",
            "control": "publish_decision bleibt review/suppressed bis Betreiber-Review.",
            "status": "freigabepflichtig"
        },
        {
            "id": "unbounded_crawl_load",
            "risk": "Feed-Lauf belastet externe oder eigene Systeme unkontrolliert.",
            "control": "systemd Timer, Run-Gates, Timeout, begrenzte Batchgroesse und Runner-State.",
            "status": "Runner operational"
        },
        {
            "id": "retention_overrun",
            "risk": "Observations werden laenger als fachlich freigegeben gespeichert.",
            "control": "expires_at, Retention-Vertrag und Auditlog.",
            "status": "offen"
        }
    ],
    "decision_record_template": {
        "decision_id": "SEC-FEED-GO-LIVE-20260609",
        "decision": "no_go_until_required_signoffs_are_ready",
        "approvers": [
            "DB-Owner",
            "Betreiber/Datenschutz",
            "IT/Security",
            "Webbetrieb",
            "Programm-Owner"
        ],
        "required_note": "Freigabe dokumentieren, bevor produktive Speicherung oder signierte Delivery aktiviert wird.",
        "evidence_package_url": "https://saferpage.de/sicherheit/feed-approval-dossier-json",
        "storage_migration_sql_sha256": "306a569bdf0d59054861ddc8ddfcf0d09a825f097f3d1dbe88993e481f048314",
        "storage_migration_sql_url": "https://saferpage.de/sicherheit/feed-storage-migration.sql"
    },
    "environment_contract": {
        "required_for_live_feeds": [
            "SAFERPAGE_URLHAUS_AUTH_KEY",
            "SAFERPAGE_GOOGLE_SAFE_BROWSING_API_KEY"
        ],
        "required_for_signed_delivery": [
            "SAFERPAGE_WEBHOOK_SECRET oder SAFERPAGE_OPERATOR_WEBHOOK_SECRET"
        ],
        "required_for_storage": [
            "SAFERPAGE_SECURITY_FEED_STORAGE_APPROVED=yes"
        ],
        "never_export": [
            "Secret-Werte",
            "Feed-Rohpayloads",
            "Malware-Samples",
            "personenbezogene Logzeilen"
        ]
    },
    "links": {
        "html": "https://saferpage.de/sicherheit/feed-approval-dossier",
        "json": "https://saferpage.de/sicherheit/feed-approval-dossier-json",
        "csv": "https://saferpage.de/sicherheit/feed-approval-dossier-csv",
        "markdown": "https://saferpage.de/sicherheit/feed-approval-dossier-md",
        "launch_board": "https://saferpage.de/sicherheit/feed-launch-board-json",
        "storage_readiness": "https://saferpage.de/sicherheit/feed-storage-readiness-json",
        "runner_state": "https://saferpage.de/sicherheit/feed-runner-json",
        "activation": "https://saferpage.de/sicherheit/anrufer.info/feed-activation-json",
        "secrets": "https://saferpage.de/sicherheit/anrufer.info/feed-secrets-json"
    },
    "source_packages": {
        "launch_board": "https://saferpage.de/sicherheit/feed-launch-board-json?host=anrufer.info",
        "storage_readiness": "https://saferpage.de/sicherheit/feed-storage-readiness-json",
        "runner_state": "https://saferpage.de/sicherheit/feed-runner-json"
    },
    "disclaimer": "Approval-Dossier ist ein Freigabe- und Nachweispaket. Es aktiviert keine Feeds, speichert keine Treffer und enthaelt keine Secret-Werte."
}
