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

Runs{% if show_archived %} · archived{% endif %}

{% if show_archived %} Archived runs — hidden from the default listing and the review queue. ← back to active runs {% else %} Execution history, newest first. Review state applies to completed runs. View archived runs {% endif %}

{# Add-media affordance (issue #117 Phase C): a named section the dashboard "Add audio" task card links to (/runs#add-media). Both ways in live here — an upload and, when enabled, a URL fetch — so elevating one never demotes the other. #}

Add media

{% if ytdlp_enabled %}
{# Independent submission id from the upload form's, so the two never collide on a shared source_path; a double-submit of this form stays idempotent. #}
{# Passive, honest notice — NOT a status badge (the app can't prove every private destination is blocked). See docs/operations.md "URL ingestion & egress security". #}

Fetching a URL lets the downloader contact other sites, including ones a link redirects to. If you fetch links you don't fully trust, run the restricted URL-download overlay (compose.ytdlp-egress.yaml) — see the operations guide, “URL ingestion & egress security”.

{% else %}

URL ingestion is disabled.

{% endif %}
{# Search-mode toggle (issue #121): the exact keyword browse (this page) versus the ranked semantic "Meaning" search. The current query term carries across both tabs so switching modes never loses the operator's words. #}
{# Preserve the archived view across a filter submit (issue #5). #} {% if show_archived %}{% endif %} {# Detected language (issue #124): the code whisper stamped on each run, so a label like "Spanish (es)". Options are only languages some run carries. #}
{% if not page.items %}

No runs match these filters{% if filters.q %} and search{% endif %}.

{% else %}
{% for it in page.items %} {# The friendly title in the Media column carries identity; the run id is a uuid with no friendlier form, so it stays a small muted "open" link with the short hex available on hover (issue #56). #} {# Humanized LABEL only — the pill's CSS class stays the raw enum so it keeps its colour (same display-only invariant as the dashboard). #} {# Whisper's detected language (issue #124); "—" = not recorded (a run not yet transcribed, or one that predates the stamp). #} {% if it.snippet %} {# snippet.html is server-escaped with only our injected — see runs_query._render_headline; transcript text itself is never trusted. #} {% endif %} {% endfor %}
RunStatusReviewMediaLanguageCreated
open {{ it.run_id.hex[:8] }}{{ humanize_status(it.status) }} {% if it.archived %}archived{% endif %} {% if it.status == "completed" %} {% if it.label_count == 0 %}no speakers {% elif it.unresolved_count > 0 %}needs ruling ({{ it.unresolved_count }}) {% else %}resolved{% endif %} {% else %}{% endif %} {% if it.claim_live %}claimed{% if it.claimed_by %} · {{ it.claimed_by }}{% endif %}{% endif %} {# Friendly label: acquisition-metadata title (issue #36) else a cleaned filename; the raw path stays muted beneath as ground truth (issue #56). #} {{ friendly_media_label(it.title, it.source_path) }}
{{ it.source_path }}
{% if it.language %}{{ language_label(it.language) }}{% else %}{% endif %} {{ format_age(it.created_at, now=now) }}
⏱ {{ "%d:%02d" | format(it.snippet.start_seconds // 60, it.snippet.start_seconds % 60) }} — {{ it.snippet.html }}
{% endif %} {% if next_url %}

Older →

{% endif %} {% endblock %}