{# P3-T20 / P3-T21 — per-step Scrub Explorer. Reproduces §4·e of the scan-debug redesign. Renders the scrub step's redaction manifest (counts produced by ``pii_scrubber.py``) plus a hardcoded sample-redactions table -- real blob-diffing is non-trivial and intentionally out of scope (P5 follow-up). Inputs (assembled by ``routes.debug._scrub_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.step_name`` / ``view.step_type`` / ``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.capture_size_label`` — human "4.2 MB" or ``""`` * ``view.capture_blob_url`` — S3 path of the captured (pre-scrub) blob, or ``""`` * ``view.rules_version`` — int from the manifest, or ``""`` * ``view.manifest_rows`` — list of ``{key, value, value_class, annotation}`` * ``view.items_kept_label`` — "requests 164 · cookies 37 · interactions 22" or ``""`` * ``view.artifact_counts`` — list of ``{label, value}`` for the INPUT card * ``view.has_manifest`` — bool; false for pre-T14 scans Sample redactions are hardcoded (P3-T21 Option B) — a muted note marks them as not pulled from this scan's blob. #} {% 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 %}
{{ view.capture_blob_url }}
{% if view.capture_size_label %}{{ view.capture_size_label }}{% endif %}
{% else %}
— no capture blob recorded
{% endif %}
{{ view.rules_version }}
{% else %}
— not recorded
{% endif %}
| field {{ tip("Path into the captured artifact, e.g. cookie._abck or body.user.password.") }} | before {{ tip("The original captured value (illustrative; truncated).") }} | after {{ tip("The post-scrub replacement. |
rule {{ tip("The scrub_rules.py family that fired for this redaction.") }} |
|---|---|---|---|
cookie._abck |
B7vN1f…83 chars | <scrubbed> | cookie_value |
header.authorization |
Bearer eyJ0eXAiOiJKV1Q… | <scrubbed> | header_allowlist |
header.x-csrf-token |
9f3a-… | <scrubbed> | header_suffix |
url.query.email |
user@example.com | <scrubbed> | url_param_name |
body.user.password |
"swordfish" | "<string:9>" | json_shape |