{% extends "base.html" %}
{% block title %}Run #{{ run.id }} · Crawl Control Center{% endblock %}
{% block content %}
Run #{{ run.id }} — {{ policy_name }}
| Status | Job | Cluster | Started | Finished | Duration |
| {{ run.status }} |
{{ run.job_ref or '—' }} |
{{ cluster_name or 'scrapyd/local' }} |
{{ run.started_at or '—' }} |
{{ run.finished_at or '—' }} |
{{ duration_min ~ 'm' if duration_min is not none else '—' }} |
Yield
| Plan cells | Rows attempted | Rows new |
| {{ run.plan_cells if run.plan_cells is not none else '—' }} |
{{ run.rows_attempted if run.rows_attempted is not none else '—' }} |
{{ run.rows_new if run.rows_new is not none else '—' }} |
{% if run.detail %}{{ run.detail }}
{% endif %}
Plan
| Mode | Entity scope | Dates |
| {{ plan.mode or '—' }} |
{{ plan.entity_type }}{% if plan.entity_ids %} ({{ plan.entity_ids | length }} explicit){% else %} (all){% endif %} |
{{ plan.start or '?' }} → {{ plan.end or '?' }} |
| Concept | Ranked sources |
{% for c in plan.concepts %}
| {{ c.code or c.id }} | {{ c.sources | join(' → ') or '—' }} |
{% else %}
| No compiled plan on this run. |
{% endfor %}
Fetches during run window
Approximation: fetch_log rows between {{ fetch_window[0] or '?' }} and {{ fetch_window[1] }},
filtered to this run's plan concepts{% if cluster_name %} and cluster{% endif %} — overlapping runs may double-count.
| Status | Count |
{% for f in fetch_summary %}
| {{ f.status }} | {{ f.count }} |
{% else %}
| No fetches recorded in the window. |
{% endfor %}
{% endblock %}