{# P3-T22 — per-step Pipeline Replay Explorer. Reproduces §4·f of the scan-debug redesign. This is the pipeline-level replay step (one row in scan_events with step="replay"); distinct from the per-request replay UI that lives inside debug_step_validation.html. Inputs (assembled by ``routes.debug._replay_step_view``): * ``view.scan_id`` / ``view.scan_id_short`` / ``view.back_to_trace_url`` * ``view.step_index`` / ``view.step_index_padded`` / ``view.total_step_count`` * ``view.duration`` / ``view.status_label`` / ``view.status_pill_class`` * ``view.is_in_progress`` / ``view.is_cancelled_scan`` * ``view.error_class`` / ``view.error_message`` / ``view.owner_email`` * ``view.summary_sub_line`` — e.g. "5 endpoints · 4 matched expected shape · 1 differed" * ``view.endpoints`` — list of ``{ep_id, method, url, status, status_pill_class, matched_label, matched_class, reason, inspect_url}`` * ``view.replay_confidence_label`` — "0.80 · 4/5 endpoints matched" or ``""`` * ``view.replay_confidence_class`` — "v-ok"/"v-warn"/"v-danger"/"v-muted" * ``view.cooldown_label`` — "not triggered" / "applied · ..." (placeholder for now) * ``view.surfaced_label`` — "yes · banner suppressed" / "no · low-confidence banner shown" * ``view.has_endpoints`` — bool; false when scan.replay_per_endpoint is NULL #} {% extends "admin_layout.html" %} {% from 'partials/help_tooltip.html' import tip, tip_styles %} {% block page_title %}admin :: step :: {{ view.scan_id_short }} / {{ view.step_index_padded }}{% endblock %} {% block breadcrumb %} admin/ scans/ {{ view.scan_id_short }}/ step {{ view.step_index_padded }} {% endblock %} {% block head_extra %} {{ tip_styles() }} {% if view.is_in_progress %}{% endif %} {% endblock %} {% block content %} {# ============== Sticky breadcrumb strip ============== #}
{{ view.owner_email }}
{% endif %}
| # | method · url {{ tip("HTTP method + URL the pipeline replay fired against the live site.") }} | status {{ tip("HTTP status code returned by the live site for this replay. 2xx is green; 4xx/5xx render in danger.") }} | matched shape {{ tip("Whether the live response matched the captured response_summary's top-level key set. 'yes' = identical key structure; 'no' = drift; 'error' = the replay itself failed (network / SSL / timeout).") }} | reason {{ tip("Free-text explanation from the replay runner. For matched=no this typically lists the expected vs observed key sets.") }} | {{ tip("Link to the per-endpoint inspect view. The dedicated inspect surface is a P5 follow-up; the link uses ?inspect= today.") }} |
|---|---|---|---|---|---|
| {{ ep.ep_id }} | {{ ep.method }} {{ ep.url }} |
{{ ep.status if ep.status is not none else '—' }} | {{ ep.matched_label }} | {{ ep.reason or '—' }} | diff → |
replay_history cooldown · cost-capped