{
    "schema": "https://saferpage.de/schemas/dach-crawler-readiness-smoke.v1",
    "generated_at": "2026-06-09T21:05:01+00:00",
    "ok": true,
    "summary": "No-Secret-Smoke fuer DACH-Crawler-Operations, Timer-Runner, User-Agent, Seedquelle, Performance-Grenzen, Recent-Reportlinks und Screenshot-Preview-Coverage.",
    "source_ops_schema": "https://saferpage.de/schemas/dach-crawler-operations.v1",
    "source_timer_schema": "https://saferpage.de/schemas/dach-crawler-timer-runner.v1",
    "source_ops_url": "https://saferpage.de/crawler/ops-json",
    "source_timer_url": "https://saferpage.de/crawler/timer-runner-json",
    "metrics": {
        "target_count": 10,
        "http_passed_count": 10,
        "http_failed_count": 0,
        "check_count": 12,
        "passed_check_count": 10,
        "warning_check_count": 2,
        "failed_check_count": 0,
        "crawler_available": 1,
        "timer_available": 1,
        "dach_check_count": 702,
        "queue_count": 626,
        "seed_file_host_count": 86,
        "recent_report_count": 36,
        "test_index_visible_count": 200,
        "test_index_total_public_checks": 714,
        "test_index_preview_coverage_percent": 100,
        "test_index_preview_missing_count": 0,
        "test_index_preview_legacy_size_count": 648,
        "test_index_preview_contract_width": 160,
        "test_index_preview_contract_height": 150,
        "test_index_preview_contract_fit": "contain",
        "test_index_preview_contract_source_capture": "full_page",
        "test_index_preview_contract_capture_version": "contain-v3-fullpage-to-160x150",
        "test_index_crawler_german_count": 702,
        "preview_coverage_percent": 100,
        "preview_missing_count": 0,
        "error_rate_percent": 2.95,
        "max_hosts_per_run": 8,
        "concurrency": 2,
        "timeout_seconds": 90,
        "timer_gate_count": 11,
        "timer_passed_gate_count": 11,
        "timer_warning_gate_count": 0,
        "timer_blocked_gate_count": 0
    },
    "checks": [
        {
            "id": "public_routes_http_200",
            "label": "Crawler-Routen öffentlich erreichbar",
            "status": "passed",
            "evidence": "10/10 Route(s) liefern HTTP 200.",
            "operator_action": "Crawler-Evidence bleibt öffentlich verlinkt."
        },
        {
            "id": "crawler_ops_available",
            "label": "Crawler-Ops-State verfügbar",
            "status": "passed",
            "evidence": "available=yes, health=operational, dach_checks=702.",
            "operator_action": "API-Service, Port 8092 und Runner-State prüfen, wenn unavailable."
        },
        {
            "id": "timer_runner_gates_green",
            "label": "Timer-Runner-Gates ohne Blocker",
            "status": "passed",
            "evidence": "11/11 Gate(s) passed, warnings=0, blocked=0.",
            "operator_action": "Warnungen vor Skalierung prüfen."
        },
        {
            "id": "versioned_seed_visible",
            "label": "Versionierte DACH-Seedquelle sichtbar",
            "status": "passed",
            "evidence": "seed_file=config/dach-seed-domains.txt, seed_file_host_count=86.",
            "operator_action": "Timer mit config/dach-seed-domains.txt ausführen und Runner-State erneut prüfen."
        },
        {
            "id": "public_user_agent_policy",
            "label": "User-Agent mit Betreiberlink und Beispielreports",
            "status": "passed",
            "evidence": "SaferPageCrawler/0.3 (+https://saferpage.de/bot; schedules passive DACH website checks; report examples: https://saferpage.de/tests)",
            "operator_action": "User-Agent muss /bot und /tests nennen und in Crawler-Exports sichtbar bleiben."
        },
        {
            "id": "bounded_performance_limits",
            "label": "Batch, Parallelität und Timeout begrenzt",
            "status": "passed",
            "evidence": "max_hosts_per_run=8, concurrency=2, timeout_seconds=90.",
            "operator_action": "Grenzen nur nach Last-, Fehler-, robots.txt- und Screenshot-Worker-Prüfung erhöhen."
        },
        {
            "id": "recent_reports_linked",
            "label": "Zuletzt geprüfte Reports direkt verlinkt",
            "status": "passed",
            "evidence": "36 Reportlink(s) im Timer-Runner-Export.",
            "operator_action": "Recent-Checks, /tests und kanonische Kurz-URLs prüfen, wenn keine Reports erscheinen."
        },
        {
            "id": "public_test_index_metrics_ready",
            "label": "Public-Test-Index liefert Recent-, Preview- und Crawler-Metriken",
            "status": "passed",
            "evidence": "visible_count=200, total_public_checks=714, preview_coverage_percent=100, preview_missing_count=0, preview_legacy_size_count=648, crawler_german_count=702.",
            "operator_action": "tests-json muss einen metrics-Block mit sichtbaren Reports, Gesamtzahl, Preview-Coverage und Crawler-Zählern liefern."
        },
        {
            "id": "public_test_index_preview_contract",
            "label": "Public-Test-Index erzwingt 160x150-Full-Page-Preview-Vertrag",
            "status": "warning",
            "evidence": "contract=160x150, fit=contain, source_capture=full_page, capture_version=contain-v3-fullpage-to-160x150, legacy_size_count=648.",
            "operator_action": "Alte 100x100- oder Crop-Artefakte per Backfill ersetzen; Worker/Scanner/Index müssen denselben 160x150-contain-Vertrag melden."
        },
        {
            "id": "preview_coverage_ready",
            "label": "Screenshot-Preview-Coverage produktreif",
            "status": "warning",
            "evidence": "preview_coverage_percent=100, preview_missing_count=0, test_index_legacy_size_count=648.",
            "operator_action": "Fehlende 160x150-Seitenvorschauen per Screenshot-Backfill nachziehen."
        },
        {
            "id": "error_and_queue_stop_guards",
            "label": "Fehlerquote und Queue-Druck unter Stop-Schwellen",
            "status": "passed",
            "evidence": "error_rate_percent=2.95, queue_count=626.",
            "operator_action": "Bei Fehlerquote >20% oder Queue >5000 nicht skalieren; Ursachen prüfen."
        },
        {
            "id": "no_secret_publication",
            "label": "Crawler-Smoke ohne Secrets und Besucherlogs",
            "status": "passed",
            "evidence": "Keine Forbidden-Pattern-Treffer in Ops/Timer-JSON.",
            "operator_action": "Neue Felder weiter auf Rohpayloads, IPs, Tokens und Besucherlogs prüfen."
        }
    ],
    "failed_checks": [],
    "warning_checks": [
        {
            "id": "public_test_index_preview_contract",
            "label": "Public-Test-Index erzwingt 160x150-Full-Page-Preview-Vertrag",
            "status": "warning",
            "evidence": "contract=160x150, fit=contain, source_capture=full_page, capture_version=contain-v3-fullpage-to-160x150, legacy_size_count=648.",
            "operator_action": "Alte 100x100- oder Crop-Artefakte per Backfill ersetzen; Worker/Scanner/Index müssen denselben 160x150-contain-Vertrag melden."
        },
        {
            "id": "preview_coverage_ready",
            "label": "Screenshot-Preview-Coverage produktreif",
            "status": "warning",
            "evidence": "preview_coverage_percent=100, preview_missing_count=0, test_index_legacy_size_count=648.",
            "operator_action": "Fehlende 160x150-Seitenvorschauen per Screenshot-Backfill nachziehen."
        }
    ],
    "targets": [
        {
            "id": "crawler_html",
            "label": "Crawler Operations HTML",
            "url": "https://saferpage.de/crawler",
            "path": "/crawler",
            "expected_http_status": 200,
            "actual_http_status": 200,
            "ok": true,
            "started_at": "2026-06-09T21:04:52Z",
            "finished_at": "2026-06-09T21:04:54Z"
        },
        {
            "id": "crawler_ops_json",
            "label": "Crawler Operations JSON",
            "url": "https://saferpage.de/crawler/ops-json",
            "path": "/crawler/ops-json",
            "expected_http_status": 200,
            "actual_http_status": 200,
            "ok": true,
            "started_at": "2026-06-09T21:04:54Z",
            "finished_at": "2026-06-09T21:04:55Z"
        },
        {
            "id": "crawler_ops_csv",
            "label": "Crawler Operations CSV",
            "url": "https://saferpage.de/crawler/ops-csv",
            "path": "/crawler/ops-csv",
            "expected_http_status": 200,
            "actual_http_status": 200,
            "ok": true,
            "started_at": "2026-06-09T21:04:55Z",
            "finished_at": "2026-06-09T21:04:56Z"
        },
        {
            "id": "crawler_ops_markdown",
            "label": "Crawler Operations Markdown",
            "url": "https://saferpage.de/crawler/ops-md",
            "path": "/crawler/ops-md",
            "expected_http_status": 200,
            "actual_http_status": 200,
            "ok": true,
            "started_at": "2026-06-09T21:04:56Z",
            "finished_at": "2026-06-09T21:04:57Z"
        },
        {
            "id": "crawler_timer_html",
            "label": "Crawler Timer Runner HTML",
            "url": "https://saferpage.de/crawler/timer-runner",
            "path": "/crawler/timer-runner",
            "expected_http_status": 200,
            "actual_http_status": 200,
            "ok": true,
            "started_at": "2026-06-09T21:04:57Z",
            "finished_at": "2026-06-09T21:04:58Z"
        },
        {
            "id": "crawler_timer_json",
            "label": "Crawler Timer Runner JSON",
            "url": "https://saferpage.de/crawler/timer-runner-json",
            "path": "/crawler/timer-runner-json",
            "expected_http_status": 200,
            "actual_http_status": 200,
            "ok": true,
            "started_at": "2026-06-09T21:04:58Z",
            "finished_at": "2026-06-09T21:04:58Z"
        },
        {
            "id": "crawler_timer_csv",
            "label": "Crawler Timer Runner CSV",
            "url": "https://saferpage.de/crawler/timer-runner-csv",
            "path": "/crawler/timer-runner-csv",
            "expected_http_status": 200,
            "actual_http_status": 200,
            "ok": true,
            "started_at": "2026-06-09T21:04:58Z",
            "finished_at": "2026-06-09T21:04:58Z"
        },
        {
            "id": "crawler_timer_markdown",
            "label": "Crawler Timer Runner Markdown",
            "url": "https://saferpage.de/crawler/timer-runner-md",
            "path": "/crawler/timer-runner-md",
            "expected_http_status": 200,
            "actual_http_status": 200,
            "ok": true,
            "started_at": "2026-06-09T21:04:58Z",
            "finished_at": "2026-06-09T21:04:59Z"
        },
        {
            "id": "bot_policy",
            "label": "Bot Transparency",
            "url": "https://saferpage.de/bot",
            "path": "/bot",
            "expected_http_status": 200,
            "actual_http_status": 200,
            "ok": true,
            "started_at": "2026-06-09T21:04:59Z",
            "finished_at": "2026-06-09T21:04:59Z"
        },
        {
            "id": "tests_json",
            "label": "Public Test Index JSON",
            "url": "https://saferpage.de/tests-json",
            "path": "/tests-json",
            "expected_http_status": 200,
            "actual_http_status": 200,
            "ok": true,
            "started_at": "2026-06-09T21:04:59Z",
            "finished_at": "2026-06-09T21:05:01Z"
        }
    ],
    "failed_targets": [],
    "recent_report_links": [
        {
            "host": "abda.de",
            "score": 0,
            "checked_at": "2026-06-09 23:03:11.003686+02",
            "report_url": "https://saferpage.de/abda.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "4p.de",
            "score": 0,
            "checked_at": "2026-06-09 23:01:30.442858+02",
            "report_url": "https://saferpage.de/4p.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "4players.de",
            "score": 0,
            "checked_at": "2026-06-09 23:01:28.967551+02",
            "report_url": "https://saferpage.de/4players.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "3sat.de",
            "score": 0,
            "checked_at": "2026-06-09 23:01:17.194518+02",
            "report_url": "https://saferpage.de/3sat.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "2020.demokratie-leben.de",
            "score": 0,
            "checked_at": "2026-06-09 23:01:10.543797+02",
            "report_url": "https://saferpage.de/2020.demokratie-leben.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "1.ard.de",
            "score": 0,
            "checked_at": "2026-06-09 23:01:03.318094+02",
            "report_url": "https://saferpage.de/1.ard.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "11freunde.de",
            "score": 0,
            "checked_at": "2026-06-09 23:01:00.841181+02",
            "report_url": "https://saferpage.de/11freunde.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "116117-termine.de",
            "score": 32,
            "checked_at": "2026-06-09 23:00:54.308395+02",
            "report_url": "https://saferpage.de/116117-termine.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "115.de",
            "score": 0,
            "checked_at": "2026-06-09 23:00:52.433977+02",
            "report_url": "https://saferpage.de/115.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "116117.de",
            "score": 0,
            "checked_at": "2026-06-09 23:00:49.001713+02",
            "report_url": "https://saferpage.de/116117.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "blowerdoor.de",
            "score": 0,
            "checked_at": "2026-06-09 22:52:49.448603+02",
            "report_url": "https://saferpage.de/blowerdoor.de",
            "summary": "Nur mit Vorsicht nutzen"
        },
        {
            "host": "bio-tierkost.de",
            "score": 0,
            "checked_at": "2026-06-09 22:52:34.943049+02",
            "report_url": "https://saferpage.de/bio-tierkost.de",
            "summary": "Nur mit Vorsicht nutzen"
        }
    ],
    "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": []
    },
    "claim_boundary": "Dieser Smoke startet keinen Crawl, erhöht keine Parallelität, ruft keine privaten Zielsysteme ab und veröffentlicht keine Besucherlogs. Er belegt nur öffentliche Betriebs- und Readiness-Signale."
}
