{% extends 'generic/object.html' %} {% load helpers %} {% load i18n %} {% block content %}
{% trans "Change" %}
{% trans "Reference" %} {{ object.ref|placeholder }}
{% trans "Source" %} {{ object.source|linkify }}
{% trans "State" %} {% badge object.get_state_display bg_color=object.get_state_color %}
{% trans "Verdict" %} {% if object.verdict %} {% badge object.get_verdict_display bg_color=object.get_verdict_color %} {% else %} {% trans "Not yet verified" %} {% endif %}
{% trans "Requester" %} {{ object.requester|placeholder }}
{% trans "Snapshots" %}
{# Pinned as literal ids, never selectors: verifying against a #} {# re-resolved snapshot would judge the change against a different #} {# network than the one it was approved against. #}
{% trans "Baseline (before)" %} {{ object.before_snapshot_id|placeholder }}
{% trans "Post-change (after)" %} {{ object.after_snapshot_id|placeholder }}
{% trans "Branch" %} {{ object.branch_name|placeholder }}
{% trans "Applied" %}

{% trans "Attested, not measured. Nothing here can observe the network being changed, so this is a human claim about when it happened." %}

{% trans "When" %} {{ object.applied_at|placeholder }}
{% trans "Attested by" %} {{ object.applied_by|placeholder }}
{% trans "Reference" %} {{ object.applied_ref|placeholder }}
{% trans "Evidence" %}

{% trans "This is what the verdict is computed from, and the only thing it is computed from." %}

{% if criterion_outcomes %} {% for outcome in criterion_outcomes %} {% endfor %}
{% trans "Criterion" %} {% trans "Before" %} {% trans "After" %} {% trans "Result" %}
{{ outcome.criterion.name }} {% if not outcome.blocking %} {% trans "advisory" %} {% endif %} {% checkmark outcome.before_passed %} {% checkmark outcome.after_passed %} {% if outcome.flip %} {% if outcome.blocks %} {% trans "regression" %} {% else %} {{ outcome.flip }} {% endif %} {% else %} {# Never rendered as a pass. A criterion nobody #} {# evaluated is not a criterion that passed. #} {% trans "not measured" %} {% endif %}
{% else %}

{% trans "No criteria have been evaluated. A change with nothing asserted cannot be verified, only asserted to have happened." %}

{% endif %}
{{ predict_panel.heading }}
{# Advisory, and separated from Evidence above on purpose. An #} {# advisory panel that looks like evidence is how a prediction #} {# quietly becomes a decision. #}

{% trans "Advisory only. The verdict does not depend on this." %}

{{ predict_panel.message }}

{% trans "Scope" %}
{% if scoped_devices %}
    {% for scoped in scoped_devices %}
  • {{ scoped.device|linkify }} {% if not scoped.forward_device_key %} {% trans "no Forward identity" %} {% endif %}
  • {% endfor %}
{% else %}

{% trans "No devices in scope." %}

{% endif %}
{% trans "Reviews" %}
{# Two gates. The pre gate approves the PLAN; the post gate approves #} {# the CLOSURE, which is where the branch actually merges. A PROCEED #} {# verdict opens that gate rather than walking through it. #} {% if reviews %} {% for review in reviews %} {% endfor %}
{{ review.reviewer|placeholder }} {{ review.phase }} {% if review.approved %} {% trans "approved" %} {% else %} {% trans "rejected" %} {% endif %} {{ review.comment }}
{% else %}

{% trans "No reviews yet." %}

{% endif %} {% if perms.forward_netbox.approve_forwardchange %}
{% csrf_token %}
{% endif %}
{% trans "Next steps" %}
{% if transitions %} {% for transition in transitions %} {% endfor %}
{{ transition.target }} {% if transition.allowed %} {% trans "ready" %} {% else %}
    {% for blocker in transition.blockers %}
  • {{ blocker }}
  • {% endfor %}
{% endif %}
{% else %}

{% trans "This change is finished; there is nowhere further to go." %}

{% endif %}
{% endblock content %}