{% comment %} The live audience count (SPEC §13.1: "live audience-count + estimated-eligible preview via set-wise compliance"). Every number here comes from apps/broadcasts/audience.py::preview, which is three aggregate queries over the same annotation the send will use — so what an operator reads here and what the fanout does cannot drift. `window_notice` is apps/broadcasts/composer.py::window_notice — the sentence a platform whose messaging window cannot be reopened owes the operator *before* the counts explain themselves. Empty for every platform where the question does not arise, so this renders nothing rather than branching on a platform name. The reasons are `apps.messaging.codes.describe` output, looked up server-side from the Denial code on each verdict. Contact names are attacker-controlled strings on the team-browser path (SECURITY-BASELINE §2) and are escaped by the template like any other value; nothing here is marked safe. {% endcomment %} {% if window_notice %}

{{ window_notice }}

{% endif %} {% if error %} {% elif preview %}
{{ preview.eligible }}
will receive it
{{ preview.total }}
match the filter
{{ preview.skipped_total }}
will be skipped
{% if preview.total == 0 %}

Nobody matches these rules yet.

{% endif %} {% for reason in reasons %}
{{ reason.label }} {% if reason.names %} e.g. {% for name in reason.names %}{{ name }}{% if not forloop.last %}, {% endif %}{% endfor %} {% endif %} {{ reason.count }}
{% endfor %}
{% else %}

Add a rule to see who this reaches.

{% endif %}