{# Status header (A3, enriched Stage E): a row of stat tiles fed only from the dashboard context already fetched by app.py's ``dashboard()`` route (via ``_health_summary`` -> ``health``) -- no fetch of its own. Health is never color-only: each tile pairs its color class with a text label and a check/alert icon. Stage E adds the CPU and RAM tiles (so the near-empty Disk card could be retired) and gives Disk/Cache a value sub-line. #}
VMs {{ health.vm_count }} {% if health.orphan_count %}({{ health.orphan_count }} orphan){% endif %} {{ health.vm_label }}
Runners {{ health.runners_active }}/{{ health.runners_total }} {{ health.runner_label }}
CPU {{ "%.0f"|format(health.cpu_pct) ~ "%" if health.cpu_pct is not none else "-" }} {% if health.ncpu %}/ {{ health.ncpu }} cores{% endif %} {{ health.cpu_label }}
RAM {{ "%.1f"|format(health.mem_used_gb) if health.mem_used_gb is not none else "-" }} {% if health.mem_total_gb is not none %}/ {{ "%.0f"|format(health.mem_total_gb) }} GB{% endif %} {{ health.mem_label }}
Disk {{ "%.0f"|format(health.disk_used_pct) ~ "%" if health.disk_used_pct is not none else "-" }} {% if health.disk_free_gb is not none %}{{ "%.0f"|format(health.disk_free_gb) }} GB free{% endif %} {{ health.disk_label }}
Cache {{ health.cache_bytes | humanbytes if health.cache_bytes is not none else "-" }} {% if health.cache_entries is not none %}{{ health.cache_entries | thousands }} entries{% endif %} {{ health.cache_label }}