{# Executions card. Replaces the old "Live VMs" table: one row per recent Gitea Actions run (the live ones included), with the build VM(s) that run spawned grouped into its VM cell, Remove action and all. Every fact gets its own column -- no cell stacks two data points with
(Run/Repo, Branch/Commit, Trigger/Actor, Duration/Started, VM/IP are each a pair that used to share one cell on two lines). A wide table is the accepted cost here: the card is already `.card--wide` and its own `.table-wrap` scrolls horizontally rather than the page. Degraded states (no token, expired token, Gitea unreachable) render a notice and still list every running VM below, so this card is never less useful than the VM table it replaces. Orphan VMs are NOT handled here: the sweep lives in the Maintenance card (Stage F retired the status-header VMs tile that carried the count); ``executions.unmatched_vms`` only exists so a powered-on VM whose run has scrolled out of the window (or that no run ever claimed) keeps its row and its Remove button. The row-count selector sits in the card's own header bar (right end) and re-fetches the card with ``?limit=N``; the card it renders carries that same limit on its polling URL, which is what makes the choice survive the 5s refresh without any client-side state. It carries no visible label -- the header text names the card and the values are self-evident -- so screen readers get ``aria-label`` instead. #}

Executions

{% if not backend_available %} {% endif %} {% if executions.error %} {% endif %} {% if executions.runs or executions.unmatched_vms %}
{% for run in executions.runs %} {% set run_icon = run.status | run_badge_icon %} {% endfor %} {% for vm in executions.unmatched_vms %} {% set parsed = vm.name | clone_job %} {% endfor %}
Run Repo Workflow Branch Commit Trigger Actor Status Duration Started VM IP / Uptime Actions
{% if run.html_url %} #{{ run.number }}{% if run.attempt > 1 %}.{{ run.attempt }}{% endif %} {% else %} #{{ run.number }}{% if run.attempt > 1 %}.{{ run.attempt }}{% endif %} {% endif %} {{ run.repo or "—" }} {{ run.workflow or "—" }} {{ run.branch or "—" }} {% if run.commit %}{{ run.commit[:7] }}{% else %}—{% endif %} {{ run.event or "—" }} {{ run.actor or "—" }}{% if run_icon %}{% endif %}{{ run.status }} {{ run.duration_sec | duration }} {% if run.started %} {% else %} — {% endif %} {% for vm in run.vms %}
{{ vm.name }}
{% else %} — {% endfor %}
{% for vm in run.vms %}
{{ vm.ip or "no ip" }} · up {{ vm.uptime_sec | duration }}
{% endfor %}
{% for vm in run.vms %}
{% endfor %}
{{ parsed.job_id or "no run" }} — — — — — — {% if vm.is_orphan %} orphan {% else %} running {% endif %} — {% if parsed.started %} {% else %} — {% endif %} {{ vm.name }} {{ vm.ip or "no ip" }} · up {{ vm.uptime_sec | duration }}
{% else %}

No recent executions{% if not executions.error %} and no VMs running{% endif %}.

{% endif %}