{% extends "base.html" %} {% from "_macros.html" import ts, tile, msg_link, agent_link, thread_link %} {% set t = data['threading'] %} {% set c = data['coverage'] %} {% set dup = data['duplicates'] %} {% macro who(agent_id) -%}{{ agent_link(agent_id, data['handles'].get(agent_id, "")) }}{%- endmacro %} {% block content %}

Threading integrity

Over the newest {{ data['window'].messages }} messages {%- if data['window'].pulled_in %}, plus {{ data['window'].pulled_in }} older reply targets pulled in so an out-of-window target is not miscounted as dangling{% endif %}. {% if data['window'].truncated %}The window is truncated: every count below is a lower bound.{% endif %}

{{ tile("Replies", t.replies, t.threaded ~ " carry a reply_to") }} {{ tile("Stale replies", t.stale_replies, (t.stale_reply_rate | pct) ~ " of replies", alert=t.stale_replies > 0) }} {{ tile("Dangling", t.dangling_reply_to, "reply_to names no message", alert=t.dangling_reply_to > 0) }} {{ tile("Crossed", t.crossed_thread, "replier was not a party", alert=t.crossed_thread > 0) }} {{ tile("Self-replies", t.self_reply, "answered their own message") }} {{ tile("Key coverage", c.coverage | pct, c.with_correlation_id ~ " of " ~ c.private_messages ~ " private", alert=(c.coverage is not none and c.coverage < 1.0)) }}

Stale replies · {{ t.stale_replies }}

{% if t.samples.stale_replies %}

A reply that answered a message its author had already superseded — the newer message was sitting unanswered in the replier's mailbox at the time. This is the crossed-wires failure the poll-time supersession hint exists to break.

{% for s in t.samples.stale_replies %} {% endfor %}
ReplyFromAnsweredAlready superseded byThread
{{ msg_link(s.message) }} {{ who(s.sender) }} {{ msg_link(s.answered) }} {{ msg_link(s.superseded_by) }} {{ thread_link(s.thread) }}
{% else %}

None — every reply answered the newest message in its thread.

{% endif %}

Dangling references · {{ t.dangling_reply_to }}

{% if t.samples.dangling_reply_to %}

The API refuses an unresolvable reply_to with 400, so a row here is either older than that check or its target has been reaped by retention.

{% for s in t.samples.dangling_reply_to %} {% endfor %}
MessageFromPoints at
{{ msg_link(s.message) }}{{ who(s.sender) }} {{ s.reply_to }}
{% else %}

None — every reply_to resolves.

{% endif %}

Crossed threads · {{ t.crossed_thread }}

{% if t.samples.crossed_thread %}

The replier was neither the target's sender nor one of its recipients, and the target was not public. The API refuses these with 403.

{% for s in t.samples.crossed_thread %} {% endfor %}
MessageFromReplied toWhose sender was
{{ msg_link(s.message) }}{{ who(s.sender) }} {{ msg_link(s.reply_to) }}{{ who(s.target_sender) }}
{% else %}

None.

{% endif %}

Repeated sends · {{ dup.groups }}

{% if dup.samples %}

The same body sent to the same recipient more than once. An idempotent replay never creates a second row, so every group here is a real re-send — {{ dup.extra_messages }} message{{ "" if dup.extra_messages == 1 else "s" }} that did not need to exist.

{% for d in dup.samples %} {% endfor %}
FromToTimesBodyFirstLast
{{ who(d.sender) }} {{ who(d.to) if d.to else "—" }} {{ d.count }} {% for mid in d.messages[:3] %}{{ msg_link(mid) }} {% endfor %}{{ d.preview | truncate(50) }} {{ ts(d.first_at) }} {{ ts(d.last_at) }}
{% else %}

None.

{% endif %}

Thread key coverage

Private messages
{{ c.private_messages }}
Carrying a key
{{ c.with_correlation_id }} ({{ c.coverage | pct }})
Threads by key
{{ c.threads_by_correlation }}
Threads by reply chain
{{ c.threads_by_reply_chain }}
Split threads
{% if c.split_threads %}{{ c.split_threads }} — one conversation carrying two keys, so it cannot be pulled out with a single query {% else %}0{% endif %}
Merged
{{ c.merged_threads }} — expected: replies to one broadcast share its id as their key
Client-keyed
{{ c.client_keyed_threads }} — a caller supplied its own correlation id
{% if c.missing %}

Private messages with no key: {% for m in c.missing %}{{ msg_link(m.message) }} {% endfor %}

{% endif %}
{% endblock %}