{% extends "base.html" %} {% block title %}{{ pipeline.title }} - Piply{% endblock %} {% block content %}
Pipeline detail

{{ pipeline.title }} DAG view.

{{ pipeline.description or "This pipeline is ready for execution, but it still needs a stronger operator-facing description in the config." }}

Back to pipelines
{% if pipeline.last_run %}{{ pipeline.last_run.status }}{% else %}no runs yet{% endif %} next {{ pipeline.next_run_label }} {{ pipeline.task_count }} tasks {{ pipeline.execution_summary }} {{ pipeline.retry_summary }} {% for target in pipeline.trigger_targets %} triggers {{ target }} {% endfor %}
Schedule
{{ pipeline.schedule_text }}
Primary entry
{{ pipeline.primary_entry }}
Flow summary
{{ pipeline.command_preview }}
Execution
{{ pipeline.execution_summary }}
Retry policy
{{ pipeline.retry_summary }}

Task graph

Select a node to inspect dependencies, see the latest status, and run just that task with its upstream prerequisites.

success running failed cancelled queued skipped
{% set cli_tasks = tasks | selectattr("task_type", "equalto", "cli") | list %} {% if cli_tasks %}

Manual command overrides

For manual runs you can replace the configured CLI command with any command directly from the UI. Batch files and shell chains are supported.

{% for task in cli_tasks %}
{{ task.task_id }}
{% endfor %}
{% endif %}

Tasks

Commands and scripts stay visible so operators can see exactly what will execute.

{% for task in tasks %} {% set latest = task_run_map.get(task.task_id) %}

{{ task.title }}

{{ task.task_id }}
{{ task.operator_label }} {% if latest %} {{ latest.status }} {% endif %}

{{ task.description or "No task-specific description provided." }}

depends_on {{ task.depends_on|join(', ') if task.depends_on else 'none' }} {% if latest %} logs {{ latest.log_count }} duration {% if latest.duration_seconds is not none %}{{ "%.1fs"|format(latest.duration_seconds) }}{% else %}-{% endif %} {% endif %}
Command or target
{{ task.command_preview }}
{% endfor %}

Recent runs

Each run keeps task-level status counts and raw log history.

{% if runs %}
{% for run in runs %}
{{ run.run_id }}

{{ run.started_at or run.created_at }}

{{ run.status }} {% if run.status not in ['queued', 'running'] %} {% endif %}
trigger {{ run.trigger }} tasks {{ run.successful_tasks }}/{{ run.task_count }} logs {{ run.log_count }} duration {% if run.duration_seconds is not none %}{{ "%.1fs"|format(run.duration_seconds) }}{% else %}-{% endif %}
{% if run.retry_of %} {% endif %} {% if run.error %} {% endif %}
{% endfor %}
{% else %}
This pipeline has not been executed yet. Use the run button above to create its first run record.
{% endif %}
{% endblock %} {% block scripts %} {% endblock %}