{# SPDX-License-Identifier: Apache-2.0 #} {# SPDX-FileCopyrightText: 2026 Marcin Zieba #} {% extends 'base/layout.html' %} {% load static %} {% block title %}Trace Review Workspace{% endblock %} {% block content %} {# htmx boost swaps the body and discards the response head, so this renders here. #}

Trace Review Workspace

{% if drift %} NetBox has changed since this preview was read. The proposed topology below is the one you reviewed, not what NetBox holds now. {% else %} This workspace matches what NetBox holds now. {% endif %} {% if retained_sync_reason %}
{{ retained_sync_reason }}
{% endif %}
{% csrf_token %}

Traces

Traces
{{ summary.traces }}
Actionable
{{ summary.actionable }}
Blocked
{{ summary.blocked }}
Invalid
{{ summary.invalid }}
No change
{{ summary.no_change }}

Terminations

Terminations resolved
{{ summary.resolved_terminations }}
Terminations open
{{ summary.unresolved_terminations }}

Proposals

Active proposals
{{ summary.active_proposals }}

Review state

Saved decisions
{{ summary.saved_decisions }}
Preview
{{ summary.preview_state }}
Source Traces
{% for trace in traces %} {{ trace.disposition }}
{{ trace.name }}
{% empty %}
This preview planned no Source Trace.
{% endfor %}
{% with trace=selected_trace %} {% if trace %}
{{ trace.disposition }} {{ trace.name }} {% if trace.sheet %} (sheet {{ trace.sheet }}{% if trace.row_number %}, row {{ trace.row_number }}{% endif %}) {% endif %}
{% for action in trace.actions %}
{% csrf_token %}
{% if not action.enabled %}
{{ action.reason }}
{% endif %} {% endfor %}
{% if trace.disposition == "invalid" and trace.findings %} {% endif %}
Source evidence
From {{ trace.endpoints.from }}
To {{ trace.endpoints.to }}
    {% for segment in trace.segments %}
  1. {{ segment.source_left }} → {{ segment.source_right }} ({{ segment.cable_class }})
  2. {% empty %}
  3. The source states no segment.
  4. {% endfor %}
Current NetBox topology
{% if trace.logical_cable %} {% if trace.logical_cable.visible %}
Logical Cable {{ trace.logical_cable.display }}
{% if trace.logical_cable.description %}
{{ trace.logical_cable.description }}
{% endif %} {% for tag in trace.logical_cable.tags %} {{ tag }} {% endfor %} {% else %}
A Logical Cable exists that you may not view.
{% endif %} {% elif trace.topology_known %}
No direct Logical Cable joins these endpoints.
{% else %}
Planning stopped before it read the current topology.
{% endif %}
Proposed physical topology
{% if trace.deletes_logical_cable %}
delete Logical Cable {% if trace.logical_cable.visible %}{{ trace.logical_cable.display }}{% endif %}
{% endif %}
    {% for segment in segment_policy_forms %}
  1. {{ segment.left }} → {{ segment.right }} {% if segment.status == "create" %} create {% elif segment.status == "reuse existing" %} reuse existing {% elif segment.status == "conflict" %} conflict {% else %} not planned {% endif %} {% if segment.pass_through %}
    Pass-Through Claim: entered at {{ segment.left }}.
    {% endif %} {% if segment.segment_key %}
    {{ segment.cable_type }} · {{ segment.cable_profile }} {% if segment.overridden %} forced {% endif %}
    {% endif %}
    {% csrf_token %} {{ segment.form.cable_type }} {{ segment.form.cable_profile }} {% if segment.overridden %} {% endif %}
    {% if segment.reason %}
    {{ segment.reason }}
    {% endif %} {% if segment.clear_reason and segment.clear_reason != segment.reason %}
    {{ segment.clear_reason }}
    {% endif %}
  2. {% empty %}
  3. Planning stopped before it proposed a topology.
  4. {% endfor %}

Devices

    {% for device in attention_devices %}
  • {{ device.label }} {{ device.state }}
    {% if device.locations or device.racks or device.u_positions %}
    Source hints: {% if device.locations %}Location {{ device.locations|join:", " }}{% endif %} {% if device.racks %}{% if device.locations %}; {% endif %}Rack {{ device.racks|join:", " }}{% endif %} {% if device.u_positions %}{% if device.locations or device.racks %}; {% endif %}U {{ device.u_positions|join:", " }}{% endif %}
    {% endif %}
    {% if not device.action_allowed %}
    {{ device.action_reason }}
    {% endif %}
    {% if device.reason %}
    {{ device.reason }}
    {% endif %}
  • {% empty %} {% if trace.resolution_started %} {% if manual_devices %}
  • Devices you mapped are shown below.
  • {% else %}
  • Every source Device on this trace resolves in NetBox.
  • {% endif %} {% else %}
  • Planning stopped before it resolved source Devices.
  • {% endif %} {% endfor %}
{% if manual_devices %}
{% for device in manual_devices %} {% endfor %}
Source DeviceSelected DeviceState
{{ device.label }} {{ device.selected }} {{ device.state }}
{% if not device.action_allowed %}
{{ device.action_reason }}
{% endif %}
{% endif %} {% if settled_devices %}
{{ settled_devices|length }} Device(s) resolved
{% for device in settled_devices %} {% endfor %}
Source DeviceSelected DeviceState
{{ device.label }} {{ device.selected }} {{ device.state }}
{% if not device.action_allowed %}
{{ device.action_reason }}
{% endif %}
{% endif %}

Terminations

    {% for termination in attention_terminations %}
  • {{ termination.label }} {{ termination.proposal.field_state }} {% if termination.resolved_device %} NetBox Device: {{ termination.resolved_device }} {% endif %} {% if termination.selected %} {{ termination.selected }} {% endif %}
    {% with field_number=forloop.counter %}
    {% if termination.proposal.has_proposal %} {% include 'netbox_data_import/_proposal_card.html' %} {% endif %}
    {% if not termination.selectable %}
    {{ termination.reason }}
    {% endif %}
    {% for action in termination.proposal.actions|slice:":2" %} {% include 'netbox_data_import/_proposal_action.html' %} {% endfor %}
    {% endwith %}
  • {% empty %} {% if trace.resolution_started %}
  • Every termination on this trace resolves to a NetBox port.
  • {% else %}
  • Planning stopped before it resolved source terminations.
  • {% endif %} {% endfor %}
{% if settled_terminations %}
{{ settled_terminations|length }} termination(s) resolved automatically by exact name match
{% for termination in settled_terminations %} {% endfor %}
TerminationKindSelected portState
{{ termination.label }} {{ termination.kind }} {{ termination.selected }} {{ termination.proposal.field_state }}
{% endif %}

Cable policy

{% for policy in cable_policy_forms %} {% empty %} {% endfor %}
CableClassCable TypeCable Profile
{{ policy.cable_class }} {% if not policy.resolved %} unresolved {% endif %} {{ policy.cable_type }} {{ policy.cable_profile }}
{% csrf_token %} {{ policy.form.cable_type }} {{ policy.form.cable_profile }}
{% if policy.reason %}
{{ policy.reason }}
{% endif %}
This trace states no CableClass.
{% if trace.findings and trace.disposition != "invalid" %}
What this trace found
    {% for finding in trace.findings %}
  • {% if finding.severity == "warning" %} warning {% endif %} {{ finding.message }}
  • {% endfor %}
{% endif %}
{% else %}
This preview planned no Source Trace.
{% endif %} {% endwith %}
{{ proposal_fields|json_script:"traceProposalFields" }}
{% endblock %}