1
0
Files
homelab-public-context/runtime/latest.json
T

39 lines
29 KiB
JSON

{
"schema_version": 1,
"channel": "homelab-runtime",
"command_id": "HOMELAB-CLUSTER-ADMIN-UPDATES-V38-V36-REPORT-GATE-FIXED-READ-ONLY-20260805T165500Z",
"status": "OK",
"rc": 0,
"host": "pve01",
"mode": "verify",
"component": "homelab-cluster-admin-update-visibility",
"started_at_utc": "2026-08-05T17:02:42Z",
"finished_at_utc": "2026-08-05T17:02:43Z",
"reference_register_checked": true,
"reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e",
"error_register_checked": true,
"error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83",
"command_sha256": "386c45ef3d2d117ba7af6240928b9c94c9d7d4edd70379326f023a199cafe143",
"duplicate_failed_command_blocked": false,
"block_reason": null,
"execution_started": true,
"change_declared": false,
"result_contract_valid": true,
"result_contract_status": null,
"result_contract_error": null,
"command_rc": 0,
"changes_made": false,
"rollback_started": false,
"rollback_restored": null,
"mutation_outcome": "NO_MUTATION",
"sanitized": true,
"secrets_included": false,
"private_addresses_included": false,
"raw_evidence_retained_locally": true,
"raw_evidence_sha256": "e2cdd02b19c3285cd639a5a22c00509237a59fd30d37ca6c7b4545373385d7d6",
"sanitized_output_sha256": "18280be36baf6d3a99198e7ab86e4d63eebb5e57d4b5ff330b08bc254d38e8ec",
"output_truncated_in_json": false,
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
"output": "HOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"HOMELAB-CLUSTER-ADMIN-UPDATES-V38-V36-REPORT-GATE-FIXED-READ-ONLY-20260805T165500Z\",\"command_rc\":0,\"control_plane_error\":null,\"mutation_outcome\":\"NO_MUTATION\",\"next_action\":\"patch the proven root route/template and restart only cluster-admin-incident-engine.service with rollback\",\"proxy_reference_count\":0,\"rc\":0,\"ready_for_actual_ui_patch_design\":true,\"report_bytes\":25528,\"report_sha256\":\"6aff9754ef0cad6693b35f068bb20bb058f066aff2d448686afa417a684c9c49\",\"rollback_restored\":false,\"rollback_started\":false,\"root_route_found\":true,\"service_active_running\":true,\"signature_file_count\":1,\"status\":\"OK\",\"uvicorn_port_8081_confirmed\":true,\"v36_exact_result_identity_confirmed\":true,\"v36_no_mutation_confirmed\":true,\"v36_report_gate_fix\":\"declared-vs-sanitized-separated\",\"v36_wrapper_mismatch_confirmed\":true,\"v37_exact_failure_identity_confirmed\":true,\"version\":1}\n{\"changes_made\":false,\"command_id\":\"HOMELAB-CLUSTER-ADMIN-UPDATES-V38-V36-REPORT-GATE-FIXED-READ-ONLY-20260805T165500Z\",\"diagnosis\":{\"next_action\":\"patch the proven root route/template and restart only cluster-admin-incident-engine.service with rollback\",\"proxy_reference_count\":0,\"ready_for_actual_ui_patch_design\":true,\"root_route\":{\"function\":\"dashboard\",\"line\":198,\"method\":\"get\",\"path\":\"/\",\"redirect_targets\":[\"/login\"],\"response_kinds\":[\"HTMLResponse\",\"RedirectResponse\"],\"templates\":[]},\"root_route_found\":true,\"service_active_running\":true,\"signature_file_count\":1,\"uvicorn_port_8081_confirmed\":true},\"incident_engine\":{\"diagnosis\":{\"next_action\":\"patch the proven root route/template and restart only cluster-admin-incident-engine.service with rollback\",\"proxy_reference_count\":0,\"ready_for_actual_ui_patch_design\":true,\"root_route\":{\"function\":\"dashboard\",\"line\":198,\"method\":\"get\",\"path\":\"/\",\"redirect_targets\":[\"/login\"],\"response_kinds\":[\"HTMLResponse\",\"RedirectResponse\"],\"templates\":[]},\"root_route_found\":true,\"service_active_running\":true,\"signature_file_count\":1,\"uvicorn_port_8081_confirmed\":true},\"euid\":0,\"framework_hints\":[\"fastapi\",\"starlette\"],\"hostname\":\"cluster-admin\",\"http_probes\":[{\"body_bytes\":0,\"body_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"contains_updates_card\":false,\"http_status\":303,\"location\":\"/login\",\"path\":\"/\",\"rc\":0,\"signature_hits\":[],\"stderr\":\"\"},{\"body_bytes\":22,\"body_sha256\":\"37ec4665a8102d115ffd1ac20dae94c98b4dac64b0c1a68228aa2a531caeb35d\",\"contains_updates_card\":false,\"http_status\":404,\"location\":null,\"path\":\"/admin\",\"rc\":0,\"signature_hits\":[],\"stderr\":\"\"},{\"body_bytes\":25,\"body_sha256\":\"8f399debe52f271e56918a3ef03cd90d60776f7c972e6807b1ef2a7437c1040c\",\"contains_updates_card\":false,\"http_status\":401,\"location\":null,\"path\":\"/api/summary\",\"rc\":0,\"signature_hits\":[],\"stderr\":\"\"},{\"body_bytes\":25,\"body_sha256\":\"8f399debe52f271e56918a3ef03cd90d60776f7c972e6807b1ef2a7437c1040c\",\"contains_updates_card\":false,\"http_status\":401,\"location\":null,\"path\":\"/api/v1/collector-runs\",\"rc\":0,\"signature_hits\":[],\"stderr\":\"\"},{\"body_bytes\":25,\"body_sha256\":\"8f399debe52f271e56918a3ef03cd90d60776f7c972e6807b1ef2a7437c1040c\",\"contains_updates_card\":false,\"http_status\":401,\"location\":null,\"path\":\"/api/v1/dependencies\",\"rc\":0,\"signature_hits\":[],\"stderr\":\"\"},{\"body_bytes\":25,\"body_sha256\":\"8f399debe52f271e56918a3ef03cd90d60776f7c972e6807b1ef2a7437c1040c\",\"contains_updates_card\":false,\"http_status\":401,\"location\":null,\"path\":\"/api/v1/entities\",\"rc\":0,\"signature_hits\":[],\"stderr\":\"\"},{\"body_bytes\":25,\"body_sha256\":\"8f399debe52f271e56918a3ef03cd90d60776f7c972e6807b1ef2a7437c1040c\",\"contains_updates_card\":false,\"http_status\":401,\"location\":null,\"path\":\"/api/v1/policies\",\"rc\":0,\"signature_hits\":[],\"stderr\":\"\"},{\"body_bytes\":25,\"body_sha256\":\"8f399debe52f271e56918a3ef03cd90d60776f7c972e6807b1ef2a7437c1040c\",\"contains_updates_card\":false,\"http_status\":401,\"location\":null,\"path\":\"/api/v1/sources\",\"rc\":0,\"signature_hits\":[],\"stderr\":\"\"},{\"body_bytes\":22,\"body_sha256\":\"37ec4665a8102d115ffd1ac20dae94c98b4dac64b0c1a68228aa2a531caeb35d\",\"contains_updates_card\":false,\"http_status\":404,\"location\":null,\"path\":\"/dashboard\",\"rc\":0,\"signature_hits\":[],\"stderr\":\"\"},{\"body_bytes\":81,\"body_sha256\":\"8c6f8f05af356537211023cc5af3bcc70916211cf8d576d67dad41ab58893c0a\",\"contains_updates_card\":false,\"http_status\":200,\"location\":null,\"path\":\"/health\",\"rc\":0,\"signature_hits\":[],\"stderr\":\"\"},{\"body_bytes\":22,\"body_sha256\":\"37ec4665a8102d115ffd1ac20dae94c98b4dac64b0c1a68228aa2a531caeb35d\",\"contains_updates_card\":false,\"http_status\":404,\"location\":null,\"path\":\"/healthz\",\"rc\":0,\"signature_hits\":[],\"stderr\":\"\"},{\"body_bytes\":1070,\"body_sha256\":\"16d82a304b953230348ed63f14d13b8ee8b3c2e1b5cbf3589b5d74d8ca736da3\",\"contains_updates_card\":false,\"http_status\":200,\"location\":null,\"path\":\"/login\",\"rc\":0,\"signature_hits\":[\"observe/notify\"],\"stderr\":\"\"},{\"body_bytes\":31,\"body_sha256\":\"83c09ba9a8daedb136f90b17a294caa90ad471a016e430df6e229acb5a81e100\",\"contains_updates_card\":false,\"http_status\":405,\"location\":null,\"path\":\"/logout\",\"rc\":0,\"signature_hits\":[],\"stderr\":\"\"},{\"body_bytes\":1015,\"body_sha256\":\"2b2555d2f7f2dd094c6a1fc1f1828221638a4d69542ccaa46beb254ab984b861\",\"contains_updates_card\":false,\"http_status\":200,\"location\":null,\"path\":\"/metrics\",\"rc\":0,\"signature_hits\":[\"Cluster Admin Incident Engine\"],\"stderr\":\"\"}],\"listeners\":[\"LISTEN 0 2048 0.0.0.0:8081 0.0.0.0:* users:((\\\"python3\\\",pid=487,fd=6))\"],\"process\":{\"cmdline\":\"/usr/bin/python3 -m uvicorn app:app --host 0.0.0.0 --port 8081 --proxy-headers --forwarded-allow-ips=<PRIVATE_IPV4>,<PRIVATE_IPV4>\",\"cwd\":\"/opt/cluster-admin-incident-engine\",\"exe\":\"/usr/bin/python3.11\",\"pid\":487},\"proxy_references\":[],\"relevant_project_files\":[{\"bytes\":28599,\"contexts\":[{\"line\":73,\"text\":\" return f\\\"\\\"\\\"<!doctype html><html lang=<REDACTED>\"},{\"line\":208,\"text\":\" cards = \\\"\\\".join([summary_card(\\\"Ноды\\\", counts[\\\"nodes\\\"], \\\"OK\\\" if counts[\\\"nodes\\\"] > 0 else \\\"ERROR\\\"), summary_card(\\\"VM и CT\\\", counts[\\\"guests\\\"], \\\"OK\\\" if counts[\\\"guests\\\"] > 0 else \\\"ERROR\\\"), summary_card(\\\"Сервисы\\\", counts[\\\"services\\\"], \\\"OK\\\" if counts[\\\"services\\\"] > 0 else \\\"ERROR\\\"), summary_card(\\\"Инциденты\\\", counts[\\\"incidents\\\"], \\\"ERROR\\\" if counts[\\\"incidents\\\"] > 0 else \\\"OK\\\")])\"},{\"line\":217,\"text\":\" incidents_html = health_section(\\\"Активные инциденты\\\", len(incidents), incidents_state, incidents_table)\"},{\"line\":220,\"text\":\" page = f\\\"\\\"\\\"<!doctype html><html lang=\\\"ru\\\"><head><meta charset=\\\"utf-8\\\"><meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1\\\"><meta http-equiv=\\\"refresh\\\" content=\\\"30\\\"><title>Cluster Admin Incident Engine</title><style>body{{margin:0;background:#07101d;color:#e8eef7;font:14px Arial}}header{{padding:14px 22px;background:#101b2b;border-bottom:1px solid #2a3b54;display:flex;justify-content:space-between}}main{{max-width:1500px;margin:auto;padding:20px}}.cards{{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}}.card,.panel{{background:#111d2e;border:1px solid #283b56;border-radius:14px;padding:16px}}.card b{{font-size:30px;display:block}}.card span,.muted{{color:#879ab3}}.grid{{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:14px}}.wide{{grid-column:1/-1}}table{{width:100%;border-collapse:collapse}}th,td{{padding:9px;border-bottom:1px solid #253750;text-align:left}}th{{color:#8fa3bc}}.state{{display:inline-flex;align-items:center;gap:7px;font-weight:700}}.state-dot{{width:10px;height:10px;border-radius:50%;display:inline-block;background:#8392a5}}.state-ok .state-dot{{background:#39d98a;box-shadow:0 0 12px rgba(57,217,138,.75)}}.state-bad .state-dot{{background:#ff5d73;box-shadow:0 0 12px rgba(255,93,115,.75)}}.state-warn .state-dot{{background:#f6c85f;box-shadow:0 0 12px rgba(246,200,95,.7)}}.state-unknown .state-dot{{background:#8392a5}}.row-bad{{background:rgba(255,93,115,.07)}}.row-warn{{background:rgba(246,200,95,.06)}}.card-health{{float:right}}.health-section{{padding:0;overflow:hidden}}.health-section summary{{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px;user-select:none}}.health-section summary::-webkit-details-marker{{display:none}}.section-heading{{display:flex;align-items:center;gap:10px;font-size:20px;font-weight:700}}.section-heading .state{{font-size:0}}.section-title{{color:#e8eef7}}.section-count{{font-size:12px;color:#879ab3;border:1px solid #334a68;border-radius:999px;padding:3px 8px}}.section-chevron{{font-size:20px;color:#8fa3bc;transition:transform .18s ease}}.health-section[open] .section-chevron{{transform:rotate(180deg)}}.health-section[open] summary{{border-bottom:1px solid #253750;margin-bottom:8px}}.section-body{{padding:0 16px 16px}}button{{background:#18283d;color:white;border:1px solid #3b506d;border-radius:8px;padding:8px 12px}}@media(max-width:800px){{.cards,.grid{{grid-template-columns:1fr 1fr}}.wide{{grid-column:1/-1}}}}</style></head><body><header><div><b>Cluster Admin Incident Engine</b> {engine_badge}<div class=muted>observe/notify · auto-heal отключён</div></div><form method=\\\"post\\\" action=\\\"/logout\\\"><input type=\\\"hidden\\\" name=\\\"csrf\\\" value=\\\"{csrf}\\\"><button>Выйти</button></form></header><main><section class=cards>{cards}</section><section class=grid>{nodes_html}{incidents_html}{services_html}</section></main></body></html>\\\"\\\"\\\"\"},{\"line\":243,\"text\":\" \\\"# HELP cluster_admin_up Cluster Admin Incident Engine availability\\\",\"}],\"path\":\"/opt/cluster-admin-incident-engine/app.py\",\"referenced_by_source\":false,\"relative_path\":\"app.py\",\"sha256\":\"17d95ebfc28cef34846a8999664019d5d032ee8176b7fedd9ceeebfc5c97e3b6\",\"signature_hits\":[\"Cluster Admin Incident Engine\",\"observe/notify\",\"auto-heal отключён\",\"Активные инциденты\",\"VM и CT\",\"Инциденты\"]}],\"routes\":[{\"function\":\"health\",\"line\":151,\"method\":\"get\",\"path\":\"/health\",\"redirect_targets\":[],\"response_kinds\":[],\"templates\":[]},{\"function\":\"get_login\",\"line\":155,\"method\":\"get\",\"path\":\"/login\",\"redirect_targets\":[\"/\"],\"response_kinds\":[\"HTMLResponse\",\"RedirectResponse\"],\"templates\":[]},{\"function\":\"post_login\",\"line\":159,\"method\":\"post\",\"path\":\"/login\",\"redirect_targets\":[\"/\"],\"response_kinds\":[\"HTMLResponse\",\"RedirectResponse\"],\"templates\":[]},{\"function\":\"logout\",\"line\":178,\"method\":\"post\",\"path\":\"/logout\",\"redirect_targets\":[\"/login\"],\"response_kinds\":[\"RedirectResponse\"],\"templates\":[]},{\"function\":\"api_summary\",\"line\":190,\"method\":\"get\",\"path\":\"/api/summary\",\"redirect_targets\":[],\"response_kinds\":[],\"templates\":[]},{\"function\":\"dashboard\",\"line\":198,\"method\":\"get\",\"path\":\"/\",\"redirect_targets\":[\"/login\"],\"response_kinds\":[\"HTMLResponse\",\"RedirectResponse\"],\"templates\":[]},{\"function\":\"metrics\",\"line\":226,\"method\":\"get\",\"path\":\"/metrics\",\"redirect_targets\":[],\"response_kinds\":[\"PlainTextResponse\"],\"templates\":[]},{\"function\":\"api_v1_entities\",\"line\":327,\"method\":\"get\",\"path\":\"/api/v1/entities\",\"redirect_targets\":[],\"response_kinds\":[],\"templates\":[]},{\"function\":\"api_v1_entity_dependencies\",\"line\":365,\"method\":\"get\",\"path\":\"/api/v1/entities/{entity_key:path}/dependencies\",\"redirect_targets\":[],\"response_kinds\":[],\"templates\":[]},{\"function\":\"api_v1_entity_detail\",\"line\":392,\"method\":\"get\",\"path\":\"/api/v1/entities/{entity_key:path}\",\"redirect_targets\":[],\"response_kinds\":[],\"templates\":[]},{\"function\":\"api_v1_dependencies\",\"line\":407,\"method\":\"get\",\"path\":\"/api/v1/dependencies\",\"redirect_targets\":[],\"response_kinds\":[],\"templates\":[]},{\"function\":\"api_v1_sources\",\"line\":437,\"method\":\"get\",\"path\":\"/api/v1/sources\",\"redirect_targets\":[],\"response_kinds\":[],\"templates\":[]},{\"function\":\"api_v1_policies\",\"line\":447,\"method\":\"get\",\"path\":\"/api/v1/policies\",\"redirect_targets\":[],\"response_kinds\":[],\"templates\":[]},{\"function\":\"api_v1_collector_runs\",\"line\":457,\"method\":\"get\",\"path\":\"/api/v1/collector-runs\",\"redirect_targets\":[],\"response_kinds\":[],\"templates\":[]}],\"service\":{\"name\":\"cluster-admin-incident-engine.service\",\"show\":{\"ActiveState\":\"active\",\"EnvironmentFiles\":\"/etc/cluster-admin-incident-engine/runtime.conf (ignore_errors=no)\",\"ExecStart\":\"{ path=/usr/bin/python3 ; argv[]=/usr/bin/python3 -m uvicorn app:app --host 0.0.0.0 --port 8081 --proxy-headers --forwarded-allow-ips=[PRIVATE_IP],127.0.0.1 ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }\",\"FragmentPath\":\"/etc/systemd/system/cluster-admin-incident-engine.service\",\"Group\":\"clusteradmin\",\"LoadState\":\"loaded\",\"MainPID\":\"487\",\"Result\":\"success\",\"SubState\":\"running\",\"UnitFileState\":\"enabled\",\"User\":\"clusteradmin\",\"WorkingDirectory\":\"/opt/cluster-admin-incident-engine\"},\"unit_bytes\":803,\"unit_path\":\"/etc/systemd/system/cluster-admin-incident-engine.service\",\"unit_sha256\":\"1892e494de5caab11100d5ea9257b82857fd6138d73cfae91e888759321745ea\",\"unit_text\":\"[Unit]\\nDescription=Cluster Admin Incident Engine web application\\nAfter=network-online.target postgresql.service\\nWants=network-online.target\\nRequires=postgresql.service\\n\\n[Service]\\nType=simple\\nUser=clusteradmin\\nGroup=clusteradmin\\nWorkingDirectory=/opt/cluster-admin-incident-engine\\nEnvironmentFile=/etc/cluster-admin-incident-engine/runtime.conf\\nExecStart=/usr/bin/python3 -m uvicorn app:app --host 0.0.0.0 --port 8081 --proxy-headers --forwarded-allow-ips=<PRIVATE_IPV4>,<PRIVATE_IPV4>\\nRestart=on-failure\\nRestartSec=5\\nUMask=0027\\nNoNewPrivileges=true\\nPrivateTmp=true\\nProtectSystem=strict\\nProtectHome=true\\nReadOnlyPaths=/etc/cluster-admin-incident-engine\\nReadWritePaths=/var/lib/cluster-admin-incident-engine\\nRestrictSUIDSGID=true\\nLockPersonality=true\\nRestrictRealtime=true\\n\\n[Install]\\nWantedBy=multi-user.target\"},\"source\":{\"bytes\":28599,\"contexts\":[{\"line\":73,\"text\":\" return f\\\"\\\"\\\"<!doctype html><html lang=<REDACTED>\"},{\"line\":151,\"text\":\"def health():\"},{\"line\":155,\"text\":\"def get_login(request:Request):\"},{\"line\":159,\"text\":\"async def post_login(request:Request):\"},{\"line\":178,\"text\":\"async def logout(request:Request):\"},{\"line\":190,\"text\":\"def api_summary(request:Request):\"},{\"line\":198,\"text\":\"def dashboard(request:Request):\"},{\"line\":208,\"text\":\" cards = \\\"\\\".join([summary_card(\\\"Ноды\\\", counts[\\\"nodes\\\"], \\\"OK\\\" if counts[\\\"nodes\\\"] > 0 else \\\"ERROR\\\"), summary_card(\\\"VM и CT\\\", counts[\\\"guests\\\"], \\\"OK\\\" if counts[\\\"guests\\\"] > 0 else \\\"ERROR\\\"), summary_card(\\\"Сервисы\\\", counts[\\\"services\\\"], \\\"OK\\\" if counts[\\\"services\\\"] > 0 else \\\"ERROR\\\"), summary_card(\\\"Инциденты\\\", counts[\\\"incidents\\\"], \\\"ERROR\\\" if counts[\\\"incidents\\\"] > 0 else \\\"OK\\\")])\"},{\"line\":217,\"text\":\" incidents_html = health_section(\\\"Активные инциденты\\\", len(incidents), incidents_state, incidents_table)\"},{\"line\":220,\"text\":\" page = f\\\"\\\"\\\"<!doctype html><html lang=\\\"ru\\\"><head><meta charset=\\\"utf-8\\\"><meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1\\\"><meta http-equiv=\\\"refresh\\\" content=\\\"30\\\"><title>Cluster Admin Incident Engine</title><style>body{{margin:0;background:#07101d;color:#e8eef7;font:14px Arial}}header{{padding:14px 22px;background:#101b2b;border-bottom:1px solid #2a3b54;display:flex;justify-content:space-between}}main{{max-width:1500px;margin:auto;padding:20px}}.cards{{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}}.card,.panel{{background:#111d2e;border:1px solid #283b56;border-radius:14px;padding:16px}}.card b{{font-size:30px;display:block}}.card span,.muted{{color:#879ab3}}.grid{{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:14px}}.wide{{grid-column:1/-1}}table{{width:100%;border-collapse:collapse}}th,td{{padding:9px;border-bottom:1px solid #253750;text-align:left}}th{{color:#8fa3bc}}.state{{display:inline-flex;align-items:center;gap:7px;font-weight:700}}.state-dot{{width:10px;height:10px;border-radius:50%;display:inline-block;background:#8392a5}}.state-ok .state-dot{{background:#39d98a;box-shadow:0 0 12px rgba(57,217,138,.75)}}.state-bad .state-dot{{background:#ff5d73;box-shadow:0 0 12px rgba(255,93,115,.75)}}.state-warn .state-dot{{background:#f6c85f;box-shadow:0 0 12px rgba(246,200,95,.7)}}.state-unknown .state-dot{{background:#8392a5}}.row-bad{{background:rgba(255,93,115,.07)}}.row-warn{{background:rgba(246,200,95,.06)}}.card-health{{float:right}}.health-section{{padding:0;overflow:hidden}}.health-section summary{{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px;user-select:none}}.health-section summary::-webkit-details-marker{{display:none}}.section-heading{{display:flex;align-items:center;gap:10px;font-size:20px;font-weight:700}}.section-heading .state{{font-size:0}}.section-title{{color:#e8eef7}}.section-count{{font-size:12px;color:#879ab3;border:1px solid #334a68;border-radius:999px;padding:3px 8px}}.section-chevron{{font-size:20px;color:#8fa3bc;transition:transform .18s ease}}.health-section[open] .section-chevron{{transform:rotate(180deg)}}.health-section[open] summary{{border-bottom:1px solid #253750;margin-bottom:8px}}.section-body{{padding:0 16px 16px}}button{{background:#18283d;color:white;border:1px solid #3b506d;border-radius:8px;padding:8px 12px}}@media(max-width:800px){{.cards,.grid{{grid-template-columns:1fr 1fr}}.wide{{grid-column:1/-1}}}}</style></head><body><header><div><b>Cluster Admin Incident Engine</b> {engine_badge}<div class=muted>observe/notify · auto-heal отключён</div></div><form method=\\\"post\\\" action=\\\"/logout\\\"><input type=\\\"hidden\\\" name=\\\"csrf\\\" value=\\\"{csrf}\\\"><button>Выйти</button></form></header><main><section class=cards>{cards}</section><section class=grid>{nodes_html}{incidents_html}{services_html}</section></main></body></html>\\\"\\\"\\\"\"},{\"line\":226,\"text\":\"def metrics():\"},{\"line\":243,\"text\":\" \\\"# HELP cluster_admin_up Cluster Admin Incident Engine availability\\\",\"},{\"line\":327,\"text\":\"def api_v1_entities(request: Request, limit: int = 100, cursor: str = \\\"\\\", entity_type: str = \\\"\\\", lifecycle_status: str = \\\"\\\", source_of_truth: str = \\\"\\\", updated_since: str = \\\"\\\", search: str = \\\"\\\"):\"},{\"line\":365,\"text\":\"def api_v1_entity_dependencies(request: Request, entity_key: str, limit: int = 100, cursor: str = \\\"\\\"):\"},{\"line\":392,\"text\":\"def api_v1_entity_detail(request: Request, entity_key: str):\"},{\"line\":407,\"text\":\"def api_v1_dependencies(request: Request, limit: int = 100, cursor: str = \\\"\\\", parent_entity_key: str = \\\"\\\", child_entity_key: str = \\\"\\\", relation_type: str = \\\"\\\", source_relation: str = \\\"\\\", criticality: str = \\\"\\\", edge_state: str = \\\"\\\"):\"},{\"line\":437,\"text\":\"def api_v1_sources(request: Request):\"},{\"line\":447,\"text\":\"def api_v1_policies(request: Request):\"},{\"line\":457,\"text\":\"def api_v1_collector_runs(request: Request, limit: int = 100, cursor: str = \\\"\\\", collector: str = \\\"\\\", status: str = \\\"\\\"):\"}],\"mode\":\"0o750\",\"path\":\"/opt/cluster-admin-incident-engine/app.py\",\"sha256\":\"17d95ebfc28cef34846a8999664019d5d032ee8176b7fedd9ceeebfc5c97e3b6\",\"signature_hits\":[\"Cluster Admin Incident Engine\",\"observe/notify\",\"auto-heal отключён\",\"Активные инциденты\",\"VM и CT\",\"Инциденты\"]},\"string_signatures\":[{\"bytes\":784,\"hits\":[\"observe/notify\"],\"line\":73,\"sha256\":\"916a8c4e0720b6087411bff84b0e4c52da7d278f6b2351bb83c458493e73fb14\"},{\"bytes\":35,\"hits\":[\"Активные инциденты\"],\"line\":217,\"sha256\":\"76189eda4d25f4aa0df4215cb7be422701f34459967c67eaea94dcc658aaea8b\"},{\"bytes\":2484,\"hits\":[\"Cluster Admin Incident Engine\"],\"line\":220,\"sha256\":\"d974c8b39c5577b8c9b0fc3e385dfd20026a3d488a5b7be240ea6d376c5a499c\"},{\"bytes\":150,\"hits\":[\"observe/notify\",\"auto-heal отключён\"],\"line\":220,\"sha256\":\"0257bad722feb6922bd54344726850a3cb4629fbb5790d2fa5f6be089fe8dcfa\"},{\"bytes\":66,\"hits\":[\"Cluster Admin Incident Engine\"],\"line\":243,\"sha256\":\"eeed47c9651559d0ed70994503a87facc182f2d16025cae1edd06ca4fae89e1d\"},{\"bytes\":8,\"hits\":[\"VM и CT\"],\"line\":208,\"sha256\":\"bd22c35cdf7a8870c0e40366c91fd77be235d4465629e603aae1f373f239e115\"},{\"bytes\":18,\"hits\":[\"Инциденты\"],\"line\":208,\"sha256\":\"4b84b970e9fc73c2d50da8d2bf2dd43021392d0a2fe98fc0beda9de5bb3bd88e\"}]},\"mutation_outcome\":\"NO_MUTATION\",\"read_only\":true,\"rollback_restored\":false,\"rollback_started\":false,\"schema\":38,\"status\":\"OK\",\"transport\":{\"rc\":0,\"stderr\":\"\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":19389,\"stdout_sha256\":\"07e5b2dd181424e7fc368c57007e0e879acc9d76269ac6916f298bc3d79a2215\"},\"v36_exact_result\":{\"actual_ui_source\":{\"bytes\":28599,\"contexts\":[{\"line\":73,\"matched\":[\"observe/notify\"],\"text\":\" return f\\\"\\\"\\\"<!doctype html><html lang=<REDACTED>\"},{\"line\":208,\"matched\":[\"VM и CT\",\"Инциденты\"],\"text\":\" cards = \\\"\\\".join([summary_card(\\\"Ноды\\\", counts[\\\"nodes\\\"], \\\"OK\\\" if counts[\\\"nodes\\\"] > 0 else \\\"ERROR\\\"), summary_card(\\\"VM и CT\\\", counts[\\\"guests\\\"], \\\"OK\\\" if counts[\\\"guests\\\"] > 0 else \\\"ERROR\\\"), summary_card(\\\"Сервисы\\\", counts[\\\"services\\\"], \\\"OK\\\" if counts[\\\"services\\\"] > 0 else \\\"ERROR\\\"), summary_card(\\\"Инциденты\\\", counts[\\\"incidents\\\"], \\\"ERROR\\\" if counts[\\\"incidents\\\"] > 0 else \\\"OK\\\")])\"},{\"line\":217,\"matched\":[\"Активные инциденты\"],\"text\":\" incidents_html = health_section(\\\"Активные инциденты\\\", len(incidents), incidents_state, incidents_table)\"},{\"line\":220,\"matched\":[\"Cluster Admin Incident Engine\",\"observe/notify\",\"auto-heal отключён\"],\"text\":\" page = f\\\"\\\"\\\"<!doctype html><html lang=\\\"ru\\\"><head><meta charset=\\\"utf-8\\\"><meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1\\\"><meta http-equiv=\\\"refresh\\\" content=\\\"30\\\"><title>Cluster Admin Incident Engine</title><style>body{{margin:0;background:#07101d;color:#e8eef7;font:14px Arial}}header{{padding:14px 22px;background:#101b2b;border-bottom:1px solid #2a3b54;display:flex;justify-content:space-between}}main{{max-width:1500px;margin:auto;padding:20px}}.cards{{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}}.card,.panel{{background:#111d2e;border:1px solid #283b56;border-radius:14px;padding:16px}}.card b{{font-size:30px;display:block}}.card span,.muted{{color:#879ab3}}.grid{{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:14px}}.wide{{grid-column:1/-1}}table{{width:100%;border-collapse:collapse}}th,td{{padding:9px;border-bottom:1px solid #253750;text-align:left}}th{{color:#8fa3bc}}.state{{display:inline-flex;align-items:center;gap:7px;font-weight:700}}.state-dot{{width:10px;height:10px;border-radius:50%;display:inline-block;background:#8392a5}}.state-ok .state-dot{{background:#39d98a;box-shadow:0 0 12px rgba(57,217,138,.75)}}.state-bad .state-dot{{background:#ff5d73;box-shadow:0 0 12px rgba(255,93,115,.75)}}.state-warn .state-dot{{background:#f6c85f;box-shadow:0 0 12px rgba(246,200,95,.7)}}.state-unknown .state-dot{{background:#8392a5}}.row-bad{{background:rgba(255,93,115,.07)}}.row-warn{{background:rgba(246,200,95,.06)}}.card-health{{float:right}}.health-section{{padding:0;overflow:hidden}}.health-section summary{{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px;user-select:none}}.health-section summary::-webkit-details-marker{{display:none}}.section-heading{{display:flex;align-items:center;gap:10px;font-size:20px;font-weight:700}}.section-heading .state{{font-size:0}}.section-title{{color:#e8eef7}}.section-count{{font-size:12px;color:#879ab3;border:1px solid #334a68;border-radius:999px;padding:3px 8px}}.section-chevron{{font-size:20px;color:#8fa3bc;transition:transform .18s ease}}.health-section[open] .section-chevron{{transform:rotate(180deg)}}.health-section[open] summary{{border-bottom:1px solid #253750;margin-bottom:8px}}.section-body{{padding:0 16px 16px}}button{{background:#18283d;color:white;border:1px solid #3b506d;border-radius:8px;padding:8px 12px}}@media(max-width:800px){{.cards,.grid{{grid-template-columns:1fr 1fr}}.wide{{grid-column:1/-1}}}}</style></head><body><header><div><b>Cluster Admin Incident Engine</b> {engine_badge}<div class=muted>observe/notify · auto-heal отключён</div></div><form method=\\\"post\\\" action=\\\"/logout\\\"><input type=\\\"hidden\\\" name=\\\"csrf\\\" value=\\\"{csrf}\\\"><button>Выйти</button></form></header><main><section class=cards>{cards}</section><section class=grid>{nodes_html}{incidents_html}{services_html}</section></main></body></html>\\\"\\\"\\\"\"},{\"line\":243,\"matched\":[\"Cluster Admin Incident Engine\"],\"text\":\" \\\"# HELP cluster_admin_up Cluster Admin Incident Engine availability\\\",\"}],\"matched_signatures\":[\"Cluster Admin Incident Engine\",\"observe/notify\",\"auto-heal отключён\",\"Активные инциденты\",\"VM и CT\",\"Инциденты\"],\"mode\":\"0o750\",\"path\":\"/opt/cluster-admin-incident-engine/app.py\",\"sha256\":\"17d95ebfc28cef34846a8999664019d5d032ee8176b7fedd9ceeebfc5c97e3b6\",\"signature_count\":6},\"changes_made\":false,\"control_plane_error\":null,\"declared_report_bytes\":492265,\"declared_report_sha256\":\"bc16503f88e93c8d475e69053eaff85dbeb016fe2e5ad6c691c93a1fbed0fd2e\",\"identity_confirmed\":true,\"mutation_outcome\":\"NO_MUTATION\",\"output_bytes\":493092,\"output_sha256\":\"d7217a95529a0a8d907db08766da9f0faa4af6995c35bf1c5d322ea831006565\",\"report_identity_mode\":\"full-output-sha-plus-declared-and-sanitized-separation\",\"rollback_restored\":null,\"rollback_started\":false,\"runner_document_rc\":0,\"runner_json_sha256\":\"463a4c5425c18d14adaecdbc4774eff7ca6b870306fa71bf3ebf6107791a83c1\",\"runner_rc\":75,\"runner_status\":\"OK\",\"runner_text_sha256\":\"1b7740f9495d1a92487a65d6edb7b66794d093589a23fcd0a68090c7e950ce1d\",\"runner_wrapper_matches_document\":false,\"sanitized_report_bytes\":492263,\"sanitized_report_sha256\":\"0d8f6f2d489ad66ff8c70990c83811b5a56efd7c67b7a378d765af58869f3020\",\"state_document_sha256\":\"9fdd04a4363b73c247da3c02603a032a1d60d934e68a885d4fbf85969adf7716\",\"state_status\":\"FAIL\"},\"v37_exact_failure\":{\"changes_made\":false,\"control_plane_error\":null,\"exact_error\":\"V36 report identity\",\"identity_confirmed\":true,\"mutation_outcome\":\"NO_MUTATION\",\"output_bytes\":618,\"output_sha256\":\"82b560e0d1615666a3527ac514b89919ac321a68c365beed2fc6371b496a5a1e\",\"rollback_restored\":null,\"rollback_started\":false,\"runner_json_sha256\":\"ecec57e79e68e08a1f63bf032d113d58223e8fb1534190ef80b83360b7c3a58e\",\"runner_text_sha256\":\"8a3750ebd03c813fe14f7e28fd38883ce1059afb16adebf3773c249faefa1da7\",\"state_document_sha256\":\"473e00b0d19aa3bdaaa53bec84bdfa218e788925504e0687de52dacfa5945c1e\"}}\n"
}