{% extends "base.html" %} {% block title %}Delta View — {{ pipeline.name }} — ICDEV™{% endblock %} {% block content %}
← Twin Dashboard

Delta View — {{ pipeline.name }}

Structural diff between two pipeline DAG snapshots with pre-merge gate assessment.

{% if error %}
Error: {{ error }}
← Back to pipeline twin
{% else %}

Pre-Merge Gate

{% if gate == 'pass' %}✅{% elif gate == 'warn' %}⚠️{% else %}❌{% endif %}
{% if gate == 'pass' %}PASS — Safe to merge{% elif gate == 'warn' %}WARN — Review removals before merging{% else %}FAIL — Too many removals, merge blocked{% endif %}
{{ removed_count }} removed · {{ added_count }} added · {{ modified_count }} modified
+{{ added_count }}
Added
-{{ removed_count }}
Removed
~{{ modified_count }}
Modified
From {{ snap_from }}{{ snap_to }}

Node Changes

{% set na = delta.nodes.added %} {% set nr = delta.nodes.removed %} {% set nm = delta.nodes.modified %} {% if not na and not nr and not nm %}

No node changes.

{% else %} {% for n in na %} {% endfor %} {% for n in nr %} {% endfor %} {% for m in nm %} {% endfor %}
ChangeIDType
+ Added{{ n.id }}{{ n.get('type','') }}
− Removed{{ n.id }}{{ n.get('type','') }}
~ Modified{{ m.proposed.id }}{{ m.proposed.get('type','') }}
{% endif %}

Edge Changes

{% set ea = delta.edges.added %} {% set er = delta.edges.removed %} {% set em = delta.edges.modified %} {% if not ea and not er and not em %}

No edge changes.

{% else %} {% for e in ea %} {% endfor %} {% for e in er %} {% endfor %} {% for m in em %} {% endfor %}
ChangeSourceTarget
+ Added{{ e.get('source','') }}{{ e.get('target','') }}
− Removed{{ e.get('source','') }}{{ e.get('target','') }}
~ Modified{{ m.proposed.get('source','') }}{{ m.proposed.get('target','') }}
{% endif %}
{% endif %} {% endblock %}