{% extends "base.html" %} {% block title %}{{ page.title }} — {{ plugin.package }}{% endblock %} {% block content %}

{{ page.title }}

{# The live state (severity badge, tiles, refused notices, plots) lives INSIDE the poll region: a polling browser swaps only this region, so anything outside it freezes at the first render (fold R-a). #}
{% include "page-readings.html" %}
{% if controls %} {# Staged changes are HOST state: the inputs render outside the poll region (a poll must not wipe an operator's in-flight input), and a staged value appears only here — never in a reading tile (§E.3). #}

Staged changes

{% if action_error %} {% endif %}
{%- for control in controls %}{{ control.input }}{% endfor %}

Apply writes each staged value, then re-reads the parameter — the page shows the read-back. No lease or policy guards this write.

{% endif %}
{% endblock %}