{# Run-detail body (issue #160). Every form posts to the existing
/runs/{id}/... action endpoints.
The page heading and primary navigation (Audio / Transcript / Review) live
in the wrapper templates' command-bar blocks, not in this partial. #}
{{ nerr.label if nerr else run.error }} {{ nerr.hint }} This stage needs the model services (ASR / diarizer / embedder).
If they aren't running, start a compute tier:
Summary
{% if run.error %}
{% set nerr = normalize_error(run.error) %}
Raw error
{{ nerr.raw }}docker compose -f compose.yaml -f compose.gpu.yaml up -d (NVIDIA GPU) or
docker compose -f compose.yaml -f compose.cpu.yaml up -d (no GPU),
wait for them to come up, then requeue. The shipped models run offline; an
HF_TOKEN is only needed if you overrode diarization to a gated
pipeline.
The initial enqueue was deferred because the task broker was unavailable. This run is queued and will start automatically once the broker recovers; no action needed.
{% endif %} {% if media_delete_result %}Deleted {{ media_delete_result.files }} derived audio file{{ "" if media_delete_result.files == 1 else "s" }}{% if media_delete_result.missing %} ({{ media_delete_result.missing }} already gone){% endif %}{% if media_delete_result.failed %}, {{ media_delete_result.failed }} could not be removed and will be swept later{% endif %}. The original source recording was kept.
{% endif %} {% if run_archived %}This run is archived, hidden from the runs list and the review queue. All its data is intact; un-archive to restore it.
{% endif %} {% if run_terminal %} {# Archive / un-archive + derived-media deletion (issue #5). Only terminal runs (completed / failed / cancelled); a live run must be cancelled first. #}{{ source_metadata.extractor }}{% if source_metadata.extractor_version %} (yt-dlp {{ source_metadata.extractor_version }}){% endif %}{{ source_metadata.description }}
{{ run.media_item.source_path }}
Source: {{ provenance }}
Complete run archive (JSON) {% if transcript_available %} · transcript & subtitle exports are on the Transcript page{% endif %} {% if media_reclaimed_at %} · Media reclaimed on {{ media_reclaimed_at.strftime("%Y-%m-%d") }} (transcript and decisions kept; re-run from source to restore audio). {% elif not audio_available and not transcript_available %} · No audio or transcript yet. {% endif %}
The model each stage saw just before it ran. This is observed immediately before the attempt, not read back from the output, so it records which model answered rather than proving the exact build.
{% for stage in model_provenance %}Not recorded. This run finished before model provenance was added, no attempt of this stage completed, or the latest completed attempt did not record it.
{% else %}{{ role.model }}{% else %}no model name reported{% endif %}
{% if role.engine %} engine {{ role.engine }}{% endif %}
{% if role.revision %}{{ role.revision }}{% endif %}
{% if role.decode_config_hash %}{{ role.decode_config_hash[:12] }}{% endif %}
The vocabulary hint transcription saw for this run, the terms from your glossary and the run's domain pack. It records what the model was told to expect, not that every term was spelled this way.
{% if run.initial_prompt %}{{ run.initial_prompt }}
Not recorded. This run has not been transcribed yet, had no vocabulary, or it finished before Voxint began recording the applied glossary.
{% endif %}{{ language_label(run.detected_language) }}
{% if run.detected_language_probability is not none %}Language detection confidence: {{ confidence_band(run.detected_language_probability) }}. This is the model's own assessment of its language guess, not a measure of transcript accuracy. It reflects the whole recording as one language; a recording that mixes languages still gets a single detected language. Short or mostly silent recordings can produce low or arbitrary detections.
{% else %}No detection score was recorded for this run.
{% endif %} {% else %}Not recorded. This run has not been transcribed yet, or it finished before Voxint began recording the detected language.
{% endif %}No stage attempts recorded yet.
{% else %}