{% extends "base.html" %} {% block title %}Run #{{ run.id }} · lake-sift{% endblock %} {% block head %} {% if run.status == 'running' %}{% endif %} {% endblock %} {% block body %} {% set d = run.detail or {} %} {% set s = run.summary or {} %}
Runs / #{{ run.id }}

Run #{{ run.id }} — {{ status_label(run.status) }}

Edit & re-run
Mode {{ kind_label(run.kind) }}
Left {{ run.left }} {{ run.source_kind }}
Right {{ run.right }}
Key {{ run.key or '—' }}
Duration {{ run.duration_ms | dur }} · {{ run.created_at | ago }}
{% if run.status == 'running' %}
Running… this page refreshes automatically.
{% elif run.status == 'error' %}

Error

{{ run.error }}
{% elif run.kind == 'preview' %} {% set files = d.files or {} %} {% set scan = d.scan or {} %} {% set bounds = d.bounds or {} %}
Files differing
{{ files.differing | comma }}
Rows to scan
{{ scan.rows_to_scan | comma }}
Of total
{{ scan.rows_total | comma }}
Scan share
{{ '%.1f%%' % ((scan.fraction or 0) * 100) }}

What the metadata proves

Provably identical{{ 'yes' if d.identical else 'no' }}
Pure append/delete (no row modified){{ 'yes' if bounds.pure_append else 'no' }}
Provably added rows{{ bounds.provably_added | comma }}
Provably removed rows{{ bounds.provably_removed | comma }}
Max rows that could have changed{{ bounds.max_changed_rows | comma }}
Partitions touched{{ d.partitions_touched | comma }}
{% if d.schema_changes %}{{ schema_table(d.schema_changes) }}{% endif %} {% elif run.kind == 'schema' %} {% if not d.schema_changes %}
Schemas match — no columns added, removed, or retyped.
{% else %} {{ schema_table(d.schema_changes) }} {% endif %} {% else %} {# ---- value diff ---- #}
Added
{{ s.added | comma }}
Removed
{{ s.removed | comma }}
Rows changed
{{ s.changed | comma }}
Cells changed
{{ s.changed_cells | comma }}
Schema Δ
{{ s.schema_changes | comma }}
{% if run.status == 'identical' %}
The two sides are identical.
{% endif %} {% if d.schema_changes %}{{ schema_table(d.schema_changes) }}{% endif %} {% if d.changed_by_column %}

Top changed columns

{% for c in d.changed_by_column %} {% endfor %}
ColumnChanged cells
{{ c.column }}{{ c.count | comma }}
{% endif %} {% if d.changed_cells %}

Changed cells {{ sample_note(s.changed_cells, d.changed_cells, d.caps.cells) }}

{% for c in d.changed_cells %} {% endfor %}
KeyColumnOldNew
{{ c.key }} {{ c.column }} {{ c.old }} {{ c.new }}
{% endif %} {{ rows_table('Added rows', d.added, s.added, d.caps.rows if d.caps else 0, 'new') }} {{ rows_table('Removed rows', d.removed, s.removed, d.caps.rows if d.caps else 0, 'old') }} {% endif %}

raw JSON

{% endblock %} {% macro schema_table(changes) %}

Schema changes

{% for c in changes %} {% endfor %}
ColumnChangeOld typeNew type
{{ c.column }} {{ c.kind }} {{ c.old_type or '—' }} {{ c.new_type or '—' }}
{% endmacro %} {% macro sample_note(total, shown, cap) %} {% if total and shown and total > (shown | length) %} (showing {{ shown | length }} of {{ total | comma }}) {% endif %} {% endmacro %} {% macro rows_table(title, rows, total, cap, cls) %} {% if rows %}

{{ title }} {{ sample_note(total, rows, cap) }}

{% for col in rows[0].keys() %}{% endfor %} {% for r in rows %} {% for v in r.values() %}{% endfor %} {% endfor %}
{{ col }}
{{ v }}
{% endif %} {% endmacro %}