{% extends "base.html" %} {% block title %}Runs - Piply{% endblock %} {% macro trigger_chip(value) -%} {{ value }} {%- endmacro %} {% block content %}
Run history

{{ runs|length }} run{{ '' if runs|length == 1 else 's' }}

Manual launches, scheduled runs, and pipeline-triggered runs share one stream. Triggered runs show the chain that led to them.

scheduler {% if scheduler.running %}live{% else %}{{ scheduler.state }}{% endif %}
Reset
{% if runs %}
{% for run in runs %} {% set chain = lineage.get(run.run_id, []) %} {% endfor %}
Run Pipeline Status Trigger & lineage Tasks Started Duration Actions
{{ run.run_id }} {{ run.pipeline_title }} {{ run.status }}
{{ trigger_chip(run.trigger) }} {% if chain %} {% for ancestor in chain %} {% if ancestor.available %} {{ ancestor.pipeline_title }} {% else %} {{ ancestor.pipeline_title }} {% endif %} {% endfor %} {{ run.pipeline_title }} {% endif %}
{{ run.successful_tasks }}/{{ run.task_count }} {{ (run.started_at or run.created_at).astimezone().strftime('%Y-%m-%d %H:%M') }} {% if run.duration_seconds is not none %}{{ "%.1fs"|format(run.duration_seconds) }}{% else %}-{% endif %}
Open {% if run.status in ['queued', 'running'] %} {% else %} {% endif %}
{% else %}
No runs match these filters. Clear them to see the full history.
{% endif %}
{% endblock %}