{# Operator dashboard metrics (issue #13). Rendered standalone on the htmx 15s poll (HX-Request) and included by dashboard.html for the full page. Pure read-only render over a SystemStats snapshot — no aggregation here; that all lives in stats_query.collect_stats(). #}

Snapshot at {{ stats.generated_at.strftime("%Y-%m-%d %H:%M:%S UTC") }}. Throughput window since {{ stats.since.strftime("%Y-%m-%d %H:%M:%S UTC") }}.

{% if since_invalid %}

Unrecognized ?since= value — showing the last 24 hours.

{% endif %}
Review backlog
{{ review_backlog }} run(s) awaiting adjudication
Runs created in window
{{ stats.runs_created_count }}
Roster size
{{ stats.roster_size }} enrolled speaker(s)

Runs by status

{% for status in run_statuses %} {# Humanized LABEL only — the CSS class stays the raw enum so the pill keeps its colour, and /metrics + JSON + `voxint stats` keep the raw string. #} {% endfor %}
StatusRuns
{{ humanize_status(status.value) }} {{ stats.status_counts.get(status.value, 0) }}

Stage timing

{% if stats.stage_durations %} {% for d in stats.stage_durations %} {% endfor %}
StageAvg durationFinished attempts
{{ humanize_stage(d.stage) }} {{ "%.2f"|format(d.avg_seconds) }}s {{ d.attempt_count }}
{% else %}

No finished stage attempts yet.

{% endif %}

Stage failures

{% if stats.stage_failure_counts %} {% for f in stats.stage_failure_counts %} {% endfor %}
StageFailed attempts
{{ humanize_stage(f.stage) }}{{ f.attempt_count }}
{% else %}

No stage failures recorded.

{% endif %}