{% 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 {} %}
Run #{{ run.id }} — {{ status_label(run.status) }}
| 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
| Column | Changed cells |
{% for c in d.changed_by_column %}
| {{ c.column }} | {{ c.count | comma }} |
{% endfor %}
{% endif %}
{% if d.changed_cells %}
Changed cells {{ sample_note(s.changed_cells, d.changed_cells, d.caps.cells) }}
| Key | Column | Old | New |
{% for c in d.changed_cells %}
| {{ c.key }} |
{{ c.column }} |
{{ c.old }} |
{{ c.new }} |
{% endfor %}
{% 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
| Column | Change | Old type | New type |
{% for c in changes %}
| {{ c.column }} |
{{ c.kind }} |
{{ c.old_type or '—' }} |
{{ c.new_type or '—' }} |
{% endfor %}
{% 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() %}| {{ col }} | {% endfor %}
{% for r in rows %}
{% for v in r.values() %}| {{ v }} | {% endfor %}
{% endfor %}
{% endif %}
{% endmacro %}