{# The speaker roster — full-page include and htmx post-mutation refresh target. Operator refusals (RosterError) arrive as roster_error and render inline; destructive forms carry hx-confirm (the plain no-JS path has no confirm — htmx is vendored and always served, so that path is a deliberate fallback). #} {% if roster_error %}
{{ roster_error }}
{% endif %} {% for entry in overview.active %}{{ entry.embeddings|length }} enrollment{{ "s" if entry.embeddings|length != 1 }} ({{ entry.embeddings|map(attribute="embedding_space")|unique|join(", ") or "none" }}) · {{ entry.assignment_count }} machine proposal{{ "s" if entry.assignment_count != 1 }} · last seen {{ entry.last_seen_at.strftime("%Y-%m-%d") if entry.last_seen_at else "never" }}
No speakers yet — enroll voices from the review workbench.
{% endfor %} {% if overview.inactive %}