Task type:all
{% for tt in task_types %}
{{ tt }}
{% endfor %}
Version:all
{% if versions_available %}
{% for v in versions_available %}
v{{ v }}
{% endfor %}
{% else %}
(no versions in window)
{% endif %}
{% if trends.insufficient %}
Not enough runs in this window — found {{ trends.runs_count }},
need at least {{ trends.min_required }} to compute trends.
Widen the time window or capture more runs.
Handoffs (agent → agent) whose behaviour shifted most when comparing the latest runs to earlier ones in this window.
{% for s in trends.drift_suspects %}
{{ s.from }}↓{{ s.to }}
Risk: {{ s.risk|capitalize }}
{% if s.risk_reason %}
{{ s.risk_reason }}
{% endif %}
Drift type
{{ s.rule_title }}{% if s.also_high_volume %} + previously high volume{% endif %}
{% if s.also_titles %}
also detected: {{ s.also_titles|join(', ') }}
{% endif %}
{% if s.insight %}
Insight
{{ s.insight }}
{% endif %}
{% if s.replacement %}
Routing impact
{{ s.replacement }}
{% endif %}
{% if s.evidence %}
Evidence
{% for row in s.evidence %}
{{ row.label }}
{{ row.recent }}
{% if row.pct is none %}
{{ row.note or '—' }}
{% else %}
{% set cls = 'flat' if row.pct == 0 else ('up' if row.pct > 0 else 'down') %}
{{ "%+.0f"|format(row.pct) }}%
{% endif %}
{% endfor %}
{% endif %}
{% if s.downstream %}
Downstream impact
{% for row in s.downstream %}
{{ row.label }}
{{ row.recent }}
{% if row.pct is none %}
{{ row.note or '—' }}
{% else %}
{% set cls = 'flat' if row.pct == 0 else ('up' if row.pct > 0 else 'down') %}
{{ "%+.0f"|format(row.pct) }}%
{% endif %}
{% endfor %}
{% endif %}
{% if s.observed_value %}
{{ s.observed_label }}
{{ s.observed_value }}
{% elif s.attribution %}
{{ s.observed_label or 'Appeared in' }}
{{ s.attribution }}
{% endif %}
{% endfor %}
{% endif %}
{# "Other" only makes sense when a flagged-suspects section precedes this one. #}
{{ 'Other common handoffs' if trends.drift_suspects else 'Common handoffs' }}
{% if trends.drift_suspects %}
The most frequent routes in this window, by volume, with the same metrics as the suspects above. A badge appears if a route also drifted but wasn't a top suspect.
{% else %}
The most frequent routes in this window, by volume. A badge appears if a route drifted.
{% endif %}
{% if trends.top_handoffs.pairs %}
{% for p in trends.top_handoffs.pairs %}
{{ p.from }}↓{{ p.to }}
{% if p.minor_drift %}
minor drift
{% endif %}
{{ p.success_rate }}%
Volume
Fires {{ p.count }} times ({{ p.pct }}% of all handoffs)
{% if p.evidence %}
Evidence
{% for row in p.evidence %}
{{ row.label }}
{{ row.recent }}
{% if row.pct is none %}
{{ row.note or '—' }}
{% else %}
{% set cls = 'flat' if row.pct == 0 else ('up' if row.pct > 0 else 'down') %}
{{ "%+.0f"|format(row.pct) }}%
{% endif %}
{% endfor %}
{% endif %}
{% if p.downstream %}
Downstream impact
{% for row in p.downstream %}
{{ row.label }}
{{ row.recent }}
{% if row.pct is none %}
{{ row.note or '—' }}
{% else %}
{% set cls = 'flat' if row.pct == 0 else ('up' if row.pct > 0 else 'down') %}
{{ "%+.0f"|format(row.pct) }}%
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
{% else %}
No handoffs captured in this window — agents may run independently without explicit transitions.
{% endif %}
{% if trends.agent_drift and (trends.agent_drift.drift or trends.agent_drift.info) %}
Agent drift summary
Per-agent behaviour change, recent runs vs earlier runs. Values are colored by risk, not by direction.
{% for a in trends.agent_drift.drift %}
{{ a.agent }}
seen in {{ a.runs_seen }} run(s)
{% set status_pill = {'critical':'drift','high':'drift','medium':'potential','watch':'watch','stable':'ok'} %}
{% set status_text = {'critical':'Critical','high':'High risk','medium':'Medium risk','watch':'Watch','stable':'Stable'} %}
{{ status_text[a.status] }}
{% if a.confidence %}
{{ a.confidence }}
{% endif %}
Insight
{{ a.insight }}
Evidence
{% for row in a.evidence %}
{{ row.label }}
{{ row.recent }}
{{ "%+.0f"|format(row.pct) }}%
{% endfor %}
Impact
{% for row in a.impact %}
{{ row.label }}
{{ row.recent }}
{{ "%+.0f"|format(row.pct) }}%
{% endfor %}
{% endfor %}
{# Lightweight info cards for agents that only appear in one half #}
{% for a in trends.agent_drift.info %}
{{ a.agent }}
seen in {{ a.runs_seen }} run(s)
{{ 'Newly observed' if a.info_type=='new' else 'Earlier only' }}
{{ a.note }}
{{ 'Recent snapshot' if a.info_type=='new' else 'Earlier snapshot' }}
{% for row in a.snapshot %}
{{ row.label }}
{{ row.value }}
—
{% endfor %}
{% endfor %}
{% endif %}
{% if trends.path_summary %}
{% set ps = trends.path_summary %}
Path summary
How the overall agent paths through the system are changing, recent runs vs earlier runs.
Avg path length
{{ ps.avg_path_length.value }} agents
{{ "%+.0f"|format(ps.avg_path_length.pct) }}%
Unique paths
{{ ps.unique_paths.value }}
{{ "%+.0f"|format(ps.unique_paths.pct) }}%
Re-invocation loops
{{ ps.reinvocation_loops.value }} runs
{{ "%+.0f"|format(ps.reinvocation_loops.pct) }}%
Most changed route
{% if ps.most_changed_route %}
{% set mc = ps.most_changed_route %}
{{ mc.from }} → {{ mc.to }}
{{ mc.agents }} agents · {{ mc.handoffs }} handoffs{% if mc.cost_pct is not none %} · {{ "%+.0f"|format(mc.cost_pct) }}% cost{% endif %}
{% else %}
—
{% endif %}
{% endif %}
{% if trends.parallel_health %}
{% set ph = trends.parallel_health %}
Parallel group health
Fan-out behaviour of the primary parallel group, recent runs vs earlier runs.
{% if ph.available %}
{# Bottleneck branch — slowest branch gating the join. Up = worse. #}
Not enough runs with a parallel group yet
({{ ph.n_early }} early · {{ ph.n_recent }} recent) — need at least one in each half.
{% endif %}
{% endif %}
{% if trends.related_changes and trends.related_changes.has_config %}
{% set rc = trends.related_changes %}
Potentially related changes
Config changes in the {{ rc.lookback_runs }} runs or {{ rc.lookback_hours }}h before the recent window —
temporal correlation only, not a confirmed cause.