Workflow Summary
{% if workflow_meta and workflow_meta.start_time %}Started {{ workflow_meta.start_time }}
{% endif %}
{{ fs.panel_head("Timeline") }}
{% for tl in timeline %}
{{ tl.label or tl.step }}
{% if tl.duration_from_prev_sec and tl.duration_from_prev_sec > 0 %}
+{{ tl.duration_from_prev_sec | round(1) }}s
{% endif %}
{% if tl.timestamp %}
{% endfor %}
{{ tl.timestamp }}
{% endif %}
{{ fs.panel_head("Step details") }}
{% for step in steps %}
{% elif count %}
{% endif %}
{% elif step.step_type == "recipe_run" %}
{% if step.detail.recipe %}
{% endif %}
{% else %}
{% endfor %}
{{ step.label or step.step }} {{ step.step }}
{% if step.step_type == "triage" %} {% set ts = step.detail.triage_summary if step.detail.triage_summary else {} %} {% set cr = step.detail.change_report if step.detail.change_report else {} %} {% set vx = step.detail.vex_applied if step.detail.vex_applied else {} %}{{ ts.total_recommendations | default(0) }} findings triaged {% if cr.new_recommendations %} · {{ cr.new_recommendations }} new recommendations{% endif %}
{% if vx.applied_count %}VEX {{ vx.applied_count }} statements applied
{% endif %} {% elif step.step_type == "tickets" %} {% set tickets = step.detail.tickets_created if step.detail.tickets_created is iterable and step.detail.tickets_created is not string and step.detail.tickets_created else [] %} {% set count = step.detail.tickets_count | default(0) %} {% if tickets %}| Component | Ticket |
|---|---|
| {{ t.component | default("—") }} | {{ t.ticket_key | default(t.key | default("—")) }} |
{{ count }} ticket{{ "s" if count != 1 }} created.
{% else %}No tickets created.
{% endif %} {% elif step.step_type == "notification" %} {% if step.detail.success %} Sent {% else %} Failed {% endif %} {% if step.detail.channel %} {{ step.detail.channel }} {% endif %} {% if step.detail.message %}{{ step.detail.message | slack_mrkdwn }}
{% endif %}
{% if step.detail.subject %}
Subject: {{ step.detail.subject }}
{% if step.detail.recipients %}To: {{ step.detail.recipients | join(', ') }}
{% endif %} {% if step.detail.body_preview %}{{ step.detail.body_preview | slack_mrkdwn }}
{% endif %}
Recipe: {{ step.detail.recipe }}
{% endif %} {% if step.detail.output_files %}{{ step.detail.output_files | length }} output file{{ "s" if step.detail.output_files | length != 1 }}
-
{% for f in step.detail.output_files %}
- {{ f.split("/") | last }} {% endfor %}
{{ step.raw_data | tojson(indent=2) }}
{% endif %}