{% extends "base.html" %} {% block title %}Voxint — dashboard{% endblock %} {% block body %}

Dashboard

A quick look at your recordings.

{# Task-first entry (issue #117 Phase C): the three things a first-run operator actually does, rendered first, above the metrics. These counts are STATIC — the 15s htmx poll below refreshes the detail tables, not this list, so the Continue count never looks live while sitting outside the poll (a live-looking but stale number is worse than a plainly static one). #} {# Disclosure carve-outs (issue #117 Phase C, codex): an error the operator must see and an input they use are never hidden, so the ?since= notice and the time-window {# A valid ?since= that isn't one of the presets (e.g. 48h or an ISO datetime, honoured by parse_since) is still the *active* window — echo it as a selected option so the control never shows a shorter span than the data actually reflects. An invalid value is cleared upstream (since_param==""), so it never reaches here. #} {% if since_param and since_param not in ("24h", "7d", "30d") %} {% endif %} {# Throughput and stage metrics demoted behind disclosure (issue #117 Phase C): the stat cards and the runs-by-status / stage-timing / stage-failure tables are reference detail, not the first-run task, so they live inside "Show run details". The htmx poll re-requests /dashboard every 15s; the route answers the HX-Request with just the fragment, swapped into this container so the page chrome and nav are untouched. The active ?since= is baked into the poll URL so a custom window survives the refresh. innerHTML swaps the contents, so this polling container — and its hx-get — persists unchanged across polls. #}
Show run details
{% include "fragments/dashboard_metrics.html" %}
{% endblock %}