{
    "schema": "https://saferpage.de/schemas/dach-crawler-timer-runner.v1",
    "generated_at": "2026-08-31T21:22:08+00:00",
    "available": true,
    "health": "attention",
    "summary": "Crawler-Timer-Runner: systemd alle 15 Minuten, maximal 320 Hosts pro Lauf, Tagesziel 20000 erfolgreiche Checks, 0 DACH-/DE-Checks, Queue 0, letzter Batch 307 Host(s), Fehlerquote 0%.",
    "metrics": {
        "gate_count": 11,
        "passed_gate_count": 10,
        "warning_gate_count": 1,
        "blocked_gate_count": 0,
        "german_count": 0,
        "queue_count": 0,
        "visited_count": 0,
        "skipped_count": 0,
        "error_count": 0,
        "error_rate_percent": 0,
        "last_batch_scanned": 307,
        "last_run_refreshed": 0,
        "last_run_refresh_candidates": 0,
        "seed_file_host_count": 0,
        "seed_host_count": 0,
        "seed_new_count": 0,
        "seed_existing_count": 0,
        "seed_queue_added_count": 0,
        "recent_report_count": 36,
        "queue_preview_count": 0,
        "run_history_count": 0,
        "rolling_24h_scanned": 0,
        "rolling_24h_succeeded": 0,
        "daily_target_status": "building"
    },
    "timer_contract": {
        "manager": "systemd",
        "unit": "saferpage-crawler.service",
        "timer": "saferpage-crawler.timer",
        "on_boot_after": "10min",
        "cadence": "15min after previous unit activation",
        "randomized_delay": "2min",
        "persistent": true,
        "service_exec_summary": "python3 scripts/crawl-german-sites.py --from-recent --seed-file config/dach-seed-domains.txt --seed-cursor-file config/tranco-dach-prioritized.txt --seed-cursor-batch 500 --seed-cursor-refill-below 3000 --rotation-batch 500 --rotation-refill-below 3000 --refresh-days 7 --refresh-limit 5000 --max 320 --concurrency 8 --timeout 90 --delay 0.25 --daily-target 20000 --daily-cap 30000 --min-free-disk-gb 300 --checkpoint-every 64",
        "resource_policy": "Nice=10 und IO-Scheduling im systemd-Service; begrenzte Batches mit Queue-Guard statt unkontrolliertem Top-1M-Crawl."
    },
    "execution_policy": {
        "max_hosts_per_run": 320,
        "concurrency": 8,
        "timeout_seconds": 90,
        "delay_between_batches_seconds": 0.25,
        "refresh_days": 7,
        "refresh_limit": 5000,
        "seed_cursor_batch": 500,
        "seed_cursor_refill_below": 3000,
        "rotation_batch": 500,
        "rotation_refill_below": 3000,
        "daily_target": 20000,
        "daily_cap": 30000,
        "min_free_disk_gb": 300,
        "checkpoint_every": 64,
        "market_focus": "deutschsprachiger Raum: .de, .at, .ch, .li, .lu und relevante deutschsprachige Inhalte.",
        "user_agent": "SaferPageCrawler/0.3 (+https://saferpage.de/bot; schedules passive DACH website checks; report examples: https://saferpage.de/tests)",
        "robots_policy": "SaferPageCrawler respektiert robots.txt; Betreiber finden Opt-out und Zweck unter /bot.",
        "browser_policy": "Headless Chromium nur für Screenshot-, Cookie-, Storage- und Consent-Nachweise, nicht für jeden Link blind.",
        "canonical_report_policy": "Jeder gespeicherte Check wird unter /{domain} verlinkt; keine .php-Reportlinks und keine Duplicate-Content-Varianten."
    },
    "seed_manifest": {
        "generated_at": "",
        "seed_file": "",
        "seed_file_host_count": 0,
        "cli_seed_count": 0,
        "recent_seed_count": 0,
        "seed_host_count": 0,
        "seed_new_count": 0,
        "seed_existing_count": 0,
        "seed_queue_added_count": 0,
        "seed_cursor_file": "",
        "seed_cursor_line": 0,
        "seed_cursor_added_count": 0,
        "seed_cursor_lines_read": 0,
        "seed_cursor_exhausted": false,
        "refresh_candidate_count": 0,
        "rotation_candidate_count": 0,
        "rotation_corpus_size": 0,
        "rotation_cycles": 0,
        "include_generic": false,
        "market_tlds": [],
        "source_policy": "Versionierte DACH-Seeddatei plus Recent-Checks, begrenzt durch kleine Timer-Batches.",
        "seed_preview": []
    },
    "readiness_gates": [
        {
            "id": "state_available",
            "label": "Runner-State erreichbar",
            "status": "passed",
            "evidence": "Die lokale Crawler-API liefert Queue, Laufhistorie und Fehlerstatus.",
            "action": "Bei blocked: API-Service, Port 8092 und Crawler-State prüfen."
        },
        {
            "id": "recent_run_recorded",
            "label": "Letzter Lauf protokolliert",
            "status": "passed",
            "evidence": "finished_at=2026-08-31T23:08:20+02:00",
            "action": "Timer manuell prüfen und nach dem nächsten Lauf erneut abrufen."
        },
        {
            "id": "schedule_contract_present",
            "label": "systemd-Timer-Vertrag vorhanden",
            "status": "passed",
            "evidence": "saferpage-crawler.timer: OnBootSec=10min, OnUnitActiveSec=15min, RandomizedDelaySec=2min, Persistent=true.",
            "action": "Nach Deploy mit systemctl list-timers saferpage-crawler.timer verifizieren."
        },
        {
            "id": "bounded_batch",
            "label": "Batch und Parallelität begrenzt",
            "status": "passed",
            "evidence": "max=320, concurrency=8, timeout=90s, cursor_batch=500.",
            "action": "Grenzen nur nach Last-, Fehler- und robots.txt-Auswertung erhöhen."
        },
        {
            "id": "versioned_seed_source",
            "label": "Versionierte DACH-Seedquelle",
            "status": "warning",
            "evidence": "Noch keine versionierte Seeddatei im Runner-State sichtbar.",
            "action": "Timer mit --seed-file config/dach-seed-domains.txt und --seed-cursor-file config/tranco-dach-prioritized.txt laufen lassen und Runner-State erneut prüfen."
        },
        {
            "id": "public_user_agent",
            "label": "User-Agent mit Betreiberlink",
            "status": "passed",
            "evidence": "SaferPageCrawler/0.3 (+https://saferpage.de/bot; schedules passive DACH website checks; report examples: https://saferpage.de/tests)",
            "action": "User-Agent muss /bot und Beispielreports nennen."
        },
        {
            "id": "robots_policy",
            "label": "robots.txt-Respekt",
            "status": "passed",
            "evidence": "Runner nutzt einen eigenen SaferPageCrawler und dokumentiert Opt-out unter /bot und /crawler.",
            "action": "Bei erhöhter Skiprate Seed-Liste und robots.txt-Regeln prüfen."
        },
        {
            "id": "error_rate_guard",
            "label": "Fehlerquote unter Stop-Schwelle",
            "status": "passed",
            "evidence": "0% bei 0 Fehlern.",
            "action": "Über 20 Prozent: Timeout, DNS, API-Log und robots.txt-Skiprate prüfen, Parallelität nicht erhöhen."
        },
        {
            "id": "queue_pressure_guard",
            "label": "Queue-Druck kontrolliert",
            "status": "passed",
            "evidence": "0 Hosts in der Queue.",
            "action": "Bei hoher Queue zusätzliche Seeds priorisieren und Batchgröße erst nach Lastprüfung erhöhen."
        },
        {
            "id": "recent_reports_linked",
            "label": "Zuletzt geprüfte Reports verlinkt",
            "status": "passed",
            "evidence": "36 direkte Kurz-URL-Links im Export.",
            "action": "Recent-Checks und Sitemap prüfen, wenn keine Links erscheinen."
        },
        {
            "id": "no_secret_export",
            "label": "No-Secret-/No-Visitor-Log-Export",
            "status": "passed",
            "evidence": "Der Timer-Runner-Export enthält Betriebsdaten, Reportlinks und Runbook, aber keine Secrets oder Besucherlogs.",
            "action": "Neue Felder vor Veröffentlichung auf Rohpayloads, IPs und Tokens prüfen."
        }
    ],
    "last_run": {
        "started_at": "2026-08-31T23:02:35+02:00",
        "finished_at": "2026-08-31T23:08:20+02:00",
        "scanned": 307,
        "queued_after_run": 0,
        "refreshed": 0,
        "refresh_candidates": 0,
        "errors": 0,
        "include_generic": false,
        "user_agent": "SaferPageCrawler/0.3 (+https://saferpage.de/bot; schedules passive DACH website checks; report examples: https://saferpage.de/tests)"
    },
    "run_history": [],
    "queue_preview": [],
    "recent_reports": [
        {
            "host": "expertinnen-bvb.career.softgarden.de",
            "score": 59,
            "checked_at": "2026-08-31 23:22:04.046576+02",
            "report_url": "https://saferpage.de/expertinnen-bvb.career.softgarden.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "explore-magazine.de",
            "score": 54,
            "checked_at": "2026-08-31 23:22:02.034623+02",
            "report_url": "https://saferpage.de/explore-magazine.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "experia-akademie.de",
            "score": 57,
            "checked_at": "2026-08-31 23:22:01.276593+02",
            "report_url": "https://saferpage.de/experia-akademie.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "experten-beraten24.de",
            "score": 60,
            "checked_at": "2026-08-31 23:21:58.222424+02",
            "report_url": "https://saferpage.de/experten-beraten24.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "expert-sergeferrari.de",
            "score": 70,
            "checked_at": "2026-08-31 23:21:57.737844+02",
            "report_url": "https://saferpage.de/expert-sergeferrari.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "expika.de",
            "score": 81,
            "checked_at": "2026-08-31 23:21:57.356218+02",
            "report_url": "https://saferpage.de/expika.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "existenzgruendercheck.de",
            "score": 59,
            "checked_at": "2026-08-31 23:21:55.453816+02",
            "report_url": "https://saferpage.de/existenzgruendercheck.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "exitdoors.de",
            "score": 57,
            "checked_at": "2026-08-31 23:21:54.735711+02",
            "report_url": "https://saferpage.de/exitdoors.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "exklusiv-vital.de",
            "score": 69,
            "checked_at": "2026-08-31 23:21:54.705826+02",
            "report_url": "https://saferpage.de/exklusiv-vital.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "exoguard.de",
            "score": 69,
            "checked_at": "2026-08-31 23:21:54.628755+02",
            "report_url": "https://saferpage.de/exoguard.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "expedition-abruzzen.de",
            "score": 59,
            "checked_at": "2026-08-31 23:21:53.688033+02",
            "report_url": "https://saferpage.de/expedition-abruzzen.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "exklusiv-vc.de",
            "score": 70,
            "checked_at": "2026-08-31 23:21:53.491436+02",
            "report_url": "https://saferpage.de/exklusiv-vc.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "excap.de",
            "score": 30,
            "checked_at": "2026-08-31 23:21:51.183761+02",
            "report_url": "https://saferpage.de/excap.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "exclusiveprints.de",
            "score": 64,
            "checked_at": "2026-08-31 23:21:43.622139+02",
            "report_url": "https://saferpage.de/exclusiveprints.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "excimer.at",
            "score": 62,
            "checked_at": "2026-08-31 23:21:42.546711+02",
            "report_url": "https://saferpage.de/excimer.at",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "excel-flo.de",
            "score": 61,
            "checked_at": "2026-08-31 23:21:42.414256+02",
            "report_url": "https://saferpage.de/excel-flo.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "ewald-arenz.de",
            "score": 29,
            "checked_at": "2026-08-31 23:21:39.198794+02",
            "report_url": "https://saferpage.de/ewald-arenz.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "ewald-schillig.de",
            "score": 62,
            "checked_at": "2026-08-31 23:21:35.58146+02",
            "report_url": "https://saferpage.de/ewald-schillig.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "ewr-crowd.de",
            "score": 64,
            "checked_at": "2026-08-31 23:21:28.380789+02",
            "report_url": "https://saferpage.de/ewr-crowd.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "exbm.de",
            "score": 72,
            "checked_at": "2026-08-31 23:21:28.374861+02",
            "report_url": "https://saferpage.de/exbm.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "examenstats.de",
            "score": 63,
            "checked_at": "2026-08-31 23:21:26.788257+02",
            "report_url": "https://saferpage.de/examenstats.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "ewto-plauen.de",
            "score": 71,
            "checked_at": "2026-08-31 23:21:26.76249+02",
            "report_url": "https://saferpage.de/ewto-plauen.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "evomark.de",
            "score": 61,
            "checked_at": "2026-08-31 23:21:24.388842+02",
            "report_url": "https://saferpage.de/evomark.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "evoservice.de",
            "score": 72,
            "checked_at": "2026-08-31 23:21:19.710501+02",
            "report_url": "https://saferpage.de/evoservice.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "evo-friseur.de",
            "score": 74,
            "checked_at": "2026-08-31 23:21:19.587877+02",
            "report_url": "https://saferpage.de/evo-friseur.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "evviagrillmerken.de",
            "score": 70,
            "checked_at": "2026-08-31 23:21:19.181773+02",
            "report_url": "https://saferpage.de/evviagrillmerken.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "evkita-saar.de",
            "score": 65,
            "checked_at": "2026-08-31 23:21:17.887097+02",
            "report_url": "https://saferpage.de/evkita-saar.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "evs-flugsimulator-berlin.de",
            "score": 56,
            "checked_at": "2026-08-31 23:21:17.87638+02",
            "report_url": "https://saferpage.de/evs-flugsimulator-berlin.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "evis-deko-cafe.de",
            "score": 67,
            "checked_at": "2026-08-31 23:21:15.546089+02",
            "report_url": "https://saferpage.de/evis-deko-cafe.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "everyonesdeal.de",
            "score": 77,
            "checked_at": "2026-08-31 23:21:07.695818+02",
            "report_url": "https://saferpage.de/everyonesdeal.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "everlastnordic.de",
            "score": 65,
            "checked_at": "2026-08-31 23:21:06.747455+02",
            "report_url": "https://saferpage.de/everlastnordic.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "eviora-natural.de",
            "score": 71,
            "checked_at": "2026-08-31 23:21:06.345074+02",
            "report_url": "https://saferpage.de/eviora-natural.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "evermotor.de",
            "score": 77,
            "checked_at": "2026-08-31 23:21:06.246724+02",
            "report_url": "https://saferpage.de/evermotor.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "evers-wesel.seat.de",
            "score": 72,
            "checked_at": "2026-08-31 23:21:04.481637+02",
            "report_url": "https://saferpage.de/evers-wesel.seat.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "eventshenslerhof.de",
            "score": 59,
            "checked_at": "2026-08-31 23:21:02.159234+02",
            "report_url": "https://saferpage.de/eventshenslerhof.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        },
        {
            "host": "eventtechnik-hug.de",
            "score": 60,
            "checked_at": "2026-08-31 23:21:00.989852+02",
            "report_url": "https://saferpage.de/eventtechnik-hug.de",
            "summary": "Schneller Mini-Check abgeschlossen"
        }
    ],
    "error_preview": [],
    "operations_runbook": {
        "purpose": "Nachweis für geplante, begrenzte und datenschutzschonende DACH-Recrawls mit direkter Report-Verlinkung.",
        "systemd_checks": [
            {
                "label": "Timer sichtbar",
                "command": "systemctl list-timers saferpage-crawler.timer --no-pager",
                "expected": "NEXT, LAST und saferpage-crawler.timer sind sichtbar."
            },
            {
                "label": "Service-Vertrag",
                "command": "systemctl cat saferpage-crawler.service saferpage-crawler.timer --no-pager",
                "expected": "ExecStart enthält --seed-file config/dach-seed-domains.txt, --seed-cursor-file config/tranco-dach-prioritized.txt, --rotation-batch 500, --max 320, --concurrency 8, --daily-target 20000; Timer enthält OnUnitActiveSec=15min."
            },
            {
                "label": "Letzte Logs",
                "command": "journalctl -u saferpage-crawler.service -n 80 --no-pager",
                "expected": "Abschluss mit scanned/refreshed/errors; keine Secret- oder Besucherlog-Ausgabe."
            },
            {
                "label": "Öffentlicher Runner-State",
                "command": "curl -fsS https://saferpage.de/crawler/timer-runner-json",
                "expected": "JSON enthält metrics, readiness_gates, last_run, recent_reports und queue_preview."
            }
        ],
        "operator_sequence": [
            "Vor Seed-Ausbau /crawler/timer-runner-json und /crawler/ops-json prüfen.",
            "Versionierte DACH-Seedliste und Top-1M-Cursor pflegen, dann Queue-/Fehlerquote nach jedem Hochlauf beobachten.",
            "Parallelität nur erhöhen, wenn API-Latenz, Fehlerquote und robots.txt-Skiprate stabil bleiben.",
            "Alle gespeicherten Checks müssen in /tests, A-Z-Sitemaps und unter /{domain} erreichbar sein.",
            "Betreibertexte im Report priorisieren Datenschutzrisiko, Tracking, Consent, konkrete Fixes und Re-Scan-Link."
        ],
        "stop_conditions": [
            "Fehlerquote über 20 Prozent oder wiederholte DNS-/Timeout-Fehler.",
            "Queue über 5000 ohne Priorisierung oder ohne Betreiber-/Seed-Plan.",
            "robots.txt-Skiprate steigt sichtbar nach Seed-Import.",
            "Headless-Chromium-/Screenshot-Worker blockiert API-Antwortzeiten.",
            "Öffentliche Exports enthalten Rohpayloads, interne Pfade, Tokens, IPs oder Besucherlogs.",
            "Reports sind nicht mehr über die kanonische Kurz-URL /{domain} erreichbar."
        ],
        "public_contract": [
            "Der Crawler identifiziert sich mit SaferPageCrawler und verweist auf /bot sowie /tests.",
            "Der Timer läuft in kleinen Batches und priorisiert deutschsprachige Domains.",
            "Screenshots bleiben kleine Vorschauen im Report; der Runner-Export verlinkt Reports, speichert aber keine privaten Rohdaten.",
            "Betreiber können Abrufe per robots.txt blockieren.",
            "Crawler-Evidence ist als HTML, JSON, CSV und Markdown verfügbar."
        ]
    },
    "links": {
        "html": "https://saferpage.de/crawler/timer-runner",
        "json": "https://saferpage.de/crawler/timer-runner-json",
        "csv": "https://saferpage.de/crawler/timer-runner-csv",
        "markdown": "https://saferpage.de/crawler/timer-runner-md",
        "crawler_ops": "https://saferpage.de/crawler/ops-json",
        "portfolio_schedule": "https://saferpage.de/portfolio/schedule-json",
        "portfolio_dispatch": "https://saferpage.de/portfolio/dispatch-json",
        "domain_intake": "https://saferpage.de/portfolio/domain-intake-json",
        "tests": "https://saferpage.de/tests",
        "bot": "https://saferpage.de/bot",
        "monitoring_feed": "https://saferpage.de/monitoring/feed.json",
        "comparison": "https://saferpage.de/vergleich/features-json"
    },
    "disclaimer": "Dieser Nachweis zeigt Timervertrag, Runner-State, Queue, letzte Reports und Betriebsregeln. Er veröffentlicht keine Secrets, keine internen IPs, keine Rohpayloads und keine personenbezogenen Besucherlogs."
}
