{% extends "base.html" %} {% block title %}Certificate Verification — FORGE Academy{% endblock %} {% block extra_css %} {% include "forge_academy/partials/_chrome_clearance.html" %} {% endblock %} {% block content %}
{% if result %}
{{ cert_def.icon if cert_def else '🎖️' }}
✓ Valid Certificate
This credential has been verified as authentic.

Recipient
{{ result.display_name }}
Certificate
{{ result.cert_label }}
Role
{{ result.role or '—' }}
Issued
{{ result.issued_at[:10] if result.issued_at else '—' }}
Verification Token
{{ result.token }}
{# aca-int-07 part 2: what was actually demonstrated. Until now this page could only repeat the label back, because issue_certificate discarded every detail check_cert_eligibility had computed. This is the snapshot taken at issue time, not a fresh computation — a certificate is a statement about a moment. #} {% set ev = result.evidence | default([]) %} {% if ev %} {% set gates = ev | selectattr('evidence_type', 'equalto', 'gate') | list %} {% set missions = ev | selectattr('evidence_type', 'equalto', 'mission') | list %} {% set steps = ev | selectattr('evidence_type', 'equalto', 'step') | list %} {% set competencies = ev | selectattr('evidence_type', 'equalto', 'competency') | list %}
Evidence recorded at issue
{{ gates|length }} requirement{{ '' if gates|length == 1 else 's' }}, {{ competencies|length }} competenc{{ 'y' if competencies|length == 1 else 'ies' }}, {{ missions|length }} mission{{ '' if missions|length == 1 else 's' }}, {{ steps|length }} verified step{{ '' if steps|length == 1 else 's' }}
{# aca-trn-02: the competency classes come FIRST, above the missions and steps. Missions and steps say what the learner did; a competency says what that work is evidence OF, in the platform's shared ontology vocabulary — which is the part a reader outside the Academy can act on. Recording the row and then filtering it out of the one page a verifier actually reads would leave the training record real but unciteable. #} {% if competencies %}
Competencies demonstrated
{% for c in competencies %}
{{ c.label }} {% if c.detail %} — {{ c.detail }}{% endif %} {% if c.demonstrated_at %} {{ c.demonstrated_at[:10] }} {% endif %}
{% endfor %}
{% endif %} {% if gates %}
Requirements met
{% for g in gates %}
{{ g.label }} {% if g.detail %} — {{ g.detail }}{% endif %}
{% endfor %}
{% endif %} {% if missions %}
Missions completed
{% for m in missions %}
{{ m.label }} — {{ m.detail }} {% if m.demonstrated_at %} {{ m.demonstrated_at[:10] }} {% endif %}
{% endfor %}
{% endif %} {% if steps %}
Verified step submissions
{% for s in steps %}
{{ s.label }} — {{ s.detail }} {% if s.score is not none %} , scored {{ s.score }} {% endif %} {% if s.demonstrated_at %} {{ s.demonstrated_at[:10] }} {% endif %}
{% endfor %}
{% endif %} {% else %} {# Say so rather than rendering an empty section that reads as "nothing required". Certificates issued before migration 317 carry no evidence and cannot be given any honestly — reconstructing it after the fact is the defect, not the fix. #}
Evidence
This certificate was issued before evidence was recorded, so the work behind it cannot be shown here.
{% endif %}
← FORGE Academy
{% else %}
❌
Invalid Token
This certificate token was not found or has been revoked.
← FORGE Academy
{% endif %}
{% endblock %}