{
    "generated_at": "2026-05-05T07:22:08-06:00",
    "environment": "production",
    "php_version": "8.1.34",
    "checks": [
        {
            "name": "DB principal",
            "status": "UP",
            "detail": "Conexión activa."
        },
        {
            "name": "DB logs",
            "status": "SHARED",
            "detail": "Reutiliza conexión principal."
        },
        {
            "name": "Directorio de logs",
            "status": "UP",
            "detail": "/home/redaction/public_html/errors/runtime (escribible)"
        },
        {
            "name": "Archivo app log (hoy)",
            "status": "UP",
            "detail": "105.52 MB"
        },
        {
            "name": "portal/error_log.txt",
            "status": "INFO",
            "detail": "5.66 MB"
        },
        {
            "name": "Cobertura /portal/* y /portales/*",
            "status": "INFO",
            "detail": "Analizados: 4 de 1434 | UP: 0 | WARN: 4 | DOWN: 0 | Cache: LIGHT"
        }
    ],
    "log_files_count": 73,
    "portal_coverage": {
        "checked_at": "2026-05-05T07:22:08-06:00",
        "scope": "/portal/* + subdominios (ligero)",
        "status": "INFO",
        "total": 4,
        "total_available": 1434,
        "up": 0,
        "warn": 4,
        "down": 0,
        "include_portales_route": false,
        "items": [
            {
                "portal_id": 1,
                "portal": "todotexcoco.com",
                "subdomain": "todotexcoco",
                "status": "INFO",
                "detail": "Cobertura ligera. Ejecute /status?probe=1 para sonda HTTP en vivo.",
                "template_expected": "blue",
                "template_detected": "",
                "http_subdomain": 0,
                "http_portal_route": 0,
                "http_portales_route": null,
                "duration_ms": 0,
                "subdomain_url": "https://todotexcoco.redaction.mx/index",
                "portal_route_url": "https://redaction.mx/portal/index.php?p=todotexcoco",
                "portales_route_url": "",
                "portales_route_enabled": false,
                "routes_checked": 0,
                "routes_ok": 0,
                "subdomain_ok": null,
                "portal_route_ok": null,
                "portales_route_ok": null
            },
            {
                "portal_id": 22,
                "portal": "ecatepecalmomento.com",
                "subdomain": "ecatepecalmomento",
                "status": "INFO",
                "detail": "Cobertura ligera. Ejecute /status?probe=1 para sonda HTTP en vivo.",
                "template_expected": "blue",
                "template_detected": "",
                "http_subdomain": 0,
                "http_portal_route": 0,
                "http_portales_route": null,
                "duration_ms": 0,
                "subdomain_url": "https://ecatepecalmomento.redaction.mx/index",
                "portal_route_url": "https://redaction.mx/portal/index.php?p=ecatepecalmomento",
                "portales_route_url": "",
                "portales_route_enabled": false,
                "routes_checked": 0,
                "routes_ok": 0,
                "subdomain_ok": null,
                "portal_route_ok": null,
                "portales_route_ok": null
            },
            {
                "portal_id": 26,
                "portal": "todochicoloapan.com",
                "subdomain": "todochicoloapan",
                "status": "INFO",
                "detail": "Cobertura ligera. Ejecute /status?probe=1 para sonda HTTP en vivo.",
                "template_expected": "times",
                "template_detected": "",
                "http_subdomain": 0,
                "http_portal_route": 0,
                "http_portales_route": null,
                "duration_ms": 0,
                "subdomain_url": "https://todochicoloapan.redaction.mx/index",
                "portal_route_url": "https://redaction.mx/portal/index.php?p=todochicoloapan",
                "portales_route_url": "",
                "portales_route_enabled": false,
                "routes_checked": 0,
                "routes_ok": 0,
                "subdomain_ok": null,
                "portal_route_ok": null,
                "portales_route_ok": null
            },
            {
                "portal_id": 35,
                "portal": "diarioalmomento.com",
                "subdomain": "diarioalmomento",
                "status": "INFO",
                "detail": "Cobertura ligera. Ejecute /status?probe=1 para sonda HTTP en vivo.",
                "template_expected": "flame",
                "template_detected": "",
                "http_subdomain": 0,
                "http_portal_route": 0,
                "http_portales_route": null,
                "duration_ms": 0,
                "subdomain_url": "https://diarioalmomento.redaction.mx/index",
                "portal_route_url": "https://redaction.mx/portal/index.php?p=diarioalmomento",
                "portales_route_url": "",
                "portales_route_enabled": false,
                "routes_checked": 0,
                "routes_ok": 0,
                "subdomain_ok": null,
                "portal_route_ok": null,
                "portales_route_ok": null
            }
        ],
        "detail": "Modo ligero sin sondas HTTP bloqueantes.",
        "_cache": {
            "status": "LIGHT",
            "age_seconds": 0,
            "ttl_seconds": 600
        }
    },
    "portal_limit": 4,
    "portal_filter": ""
}