{% extends "base.html" %} {% block title %}Submission {{ sub.id[:8] }} — {{ config.INSTANCE_NAME }}{% endblock %} {% block content %}
← Back to all submissions {% if sub.status in ['pending_inline','pending_llm'] %}
Review in progress — checks running against the bundle. Page auto-refreshes when verdict lands.
0s
{% endif %}

{{ sub.type }} · {{ sub.name | store_display_name }} {% if sub.version %}v{{ sub.version }}{% endif %}

{{ sub.id }}
Status (verdict)
{{ sub.status }}
Entity lifecycle
{%- if entity_visibility_status -%} {{ entity_visibility_status }} {%- if entity_visibility_status != sub.status %} live state — verdict immutable {%- endif %} {%- else -%} entity gone {%- endif -%}
Submitter
{{ sub.submitter_email or sub.submitter_id }}
Created
{{ sub.created_at.strftime("%Y-%m-%d %H:%M:%S UTC") if sub.created_at else "" }}
Last update
{%- if sub.updated_at -%} {{ sub.updated_at.strftime("%Y-%m-%d %H:%M:%S UTC") }} just now {%- endif -%}
Reviewed by model
{{ sub.reviewed_by_model or "—" }}
Entity ID
{% if sub.entity_id %}{{ sub.entity_id }}{% else %}none — bundle purged or legacy row{% endif %}
Bundle size
{% if sub.file_size is not none %}{% if sub.file_size < 1024 %}{{ sub.file_size }} B{% elif sub.file_size < 1048576 %}{{ "%.1f"|format(sub.file_size / 1024) }} KB{% else %}{{ "%.1f"|format(sub.file_size / 1048576) }} MB{% endif %}{% else %}—{% endif %}
Bundle SHA256
{% if sub.bundle_sha256 %}{{ sub.bundle_sha256 }}{% else %}{% endif %}
Bundle status
{%- if sub.bundle_purged_at -%} purged on {{ sub.bundle_purged_at.strftime("%Y-%m-%d %H:%M:%S UTC") }} {%- elif sub.entity_id -%} on disk {%- else -%} no bundle (legacy row) {%- endif -%}
{# Action buttons — same JSON endpoints as the list page. #}
{% if sub.status in ['blocked_inline','blocked_llm','review_error'] and sub.entity_id %} {% endif %} {% if sub.entity_id %} {% endif %} {% if sub.entity_id and not sub.bundle_purged_at %} Download bundle {% endif %} {% if sub.status in ['review_error','blocked_llm'] and sub.entity_id %} {% endif %}
{# Help text: explain why override isn't shown on this row, when applicable. #} {% if sub.status == 'approved' %}

Already approved — no override needed. Use Rescan to re-evaluate against current rules; it may flip the verdict.

{% elif sub.status == 'overridden' %}

Already admin-overridden. Rescan to clear the override and re-evaluate.

{% elif sub.status in ['blocked_inline','blocked_llm','review_error'] and not sub.entity_id %}

No override available — inline-blocked submissions are rolled back at upload time, so there's no bundle to publish. Submitter must fix and re-upload.

{% endif %}
{# ── Override history ────────────────────────────────────────────────────── #} {% if sub.override_by %}

Override

Overridden by {{ override_email or sub.override_by }}{% if sub.updated_at %} on {{ sub.updated_at.strftime("%Y-%m-%d %H:%M:%S UTC") }}{% endif %}. {% if sub.override_reason %}
Reason: {{ sub.override_reason }}{% endif %}
{% endif %} {# ── Activity timeline ───────────────────────────────────────────────────── #} {% if audit_rows %}

Activity timeline

Every recorded action on this submission + linked entity, newest first. Use this to confirm a verdict is fresh (e.g. the timestamp on the latest store.submission.rescan row matches the time you clicked Rescan).

{% endif %} {# ── Inline checks ───────────────────────────────────────────────────────── #} {% set ic = sub.inline_checks or {} %}

Manifest check {% if ic.manifest %}{{ ic.manifest.status or 'pass' }}{% endif %}

{% if ic.manifest and ic.manifest.issues %} {% else %}
No manifest issues.
{% endif %}

Static security scan {% if ic.static_security %}{{ ic.static_security.status or 'pass' }}{% endif %}

{% if ic.static_security and ic.static_security.findings %} {% for f in ic.static_security.findings %} {% endfor %}
SeverityCategoryFile:lineReasonSnippet
{{ f.severity }} {{ f.category }} {{ f.file }}:{{ f.line }} {{ f.reason }} {{ f.snippet }}
{% else %}
No security findings.
{% endif %}

Quality + templating {% if ic.quality %}{{ ic.quality.status or 'pass' }}{% endif %}

{% if ic.quality %}
Template placeholders found: {{ ic.quality.template_placeholders or 0 }}
{% if ic.quality.issues %} {% endif %} {% if ic.quality.template_recommendation %}
{{ ic.quality.template_recommendation }}
{% endif %} {% else %}
No quality data.
{% endif %}
{# ── LLM review ──────────────────────────────────────────────────────────── #}

LLM security review {% if sub.llm_findings and sub.llm_findings.risk_level %} {{ sub.llm_findings.risk_level }} {% endif %}

{% if sub.llm_findings %} {% if sub.llm_findings.error %}
Error: {{ sub.llm_findings.error }}
{% else %} {% if sub.llm_findings.summary %}

{{ sub.llm_findings.summary }}

{% endif %} {% if sub.llm_findings.findings %} {% for f in sub.llm_findings.findings %} {% endfor %}
SeverityCategoryFileExplanationFix hint
{{ f.severity }} {{ f.category }} {{ f.file }} {{ f.explanation }} {{ f.fix_hint or "" }}
{% else %}
No findings — model verdict was clean.
{% endif %} {% endif %} {% elif sub.status in ['pending_inline', 'pending_llm'] %}
Review still in progress…
{% else %}
No LLM verdict (review skipped or not yet run).
{% endif %}
{# ── Other attempts by submitter ─────────────────────────────────────────── #} {% if other_count %}

Other attempts

View {{ other_count }} other submission{{ "" if other_count == 1 else "s" }} by {{ sub.submitter_email or sub.submitter_id }} →
{% endif %}
{% endblock %}