{% extends "base.html" %} {% block title %}Monitoring - ICDEV™ Dashboard{% endblock %} {% block content %}
{{ firing_count }}
Firing Alerts
{{ resolved_count }}
Resolved Alerts
{{ unresolved_failures }}
Unresolved Failures
{{ healing_events|length }}
Self-Healing Events
{% if watchcon_summary and watchcon_summary.tiers %}
{{ watchcon_summary.tiers['4']['count'] }}
WATCHCON 4 (Routine)
{{ watchcon_summary.tiers['3']['count'] }}
WATCHCON 3 (Elevated)
{{ watchcon_summary.tiers['2']['count'] }}
WATCHCON 2 (High)
{% endif %}

Self-Healing Decision Logic

Alert Severity Distribution
Alert Status

Firing Alerts ({{ firing_count }})

{% if firing_alerts %} {# The cause, the budget and the PR were only ever in the alert's `description`, which this table never rendered. They are the facts that decide which remediation can work, so on 2026-08-10 they were read out of the database while 12 alerts were cleared by hand. #} {% for alert in firing_alerts %} {% endfor %}
WATCHCON Severity TitleCause Budget PR Seen Source Created Action
W{{ alert.watchcon_tier or 4 }} {{ alert.severity }} {{ alert.title }} {% if alert.is_stale %} {# The sweep in pr_watcher clears these; this is the window between the task finishing and the next poll — and the backstop for any case the sweep does not reach. #} stale {% endif %} {% if alert.hitl %} {{ alert.hitl.cause_label }} {% else %} — {% endif %} {{ alert.hitl.cycle_display if alert.hitl and alert.hitl.cycle_display else '—' }} {% if alert.hitl and alert.hitl.pr_url %} #{{ alert.hitl.pr_number or 'PR' }} {% else %} — {% endif %} {# Re-fire churn. The #1513 flap wrote 27 rows for one task in a day and this page could not show it. #} {% if alert.refire_count and alert.refire_count > 1 %} re-fired {{ alert.refire_count }}× {% else %} once {% endif %} {{ alert.source }} {{ alert.created_at }} {# Only a pr_watcher HITL alert names a task these verbs can act on. Every other alert source gets no buttons rather than buttons that would fail — an control that does nothing teaches people to distrust the ones that work. Same reasoning, applied to the CAUSE: rebase_and_push refuses a real conflict, so offering Rebase there is a control that cannot work either. #} {% if alert.source and alert.source.startswith('pr_watcher:hitl:') %}
{% if alert.rebase_refusal %} {% else %} {% endif %} {% if alert.rebase_refusal %}{{ alert.rebase_refusal }}{% endif %}
{% else %} — {% endif %}
{% else %}
No alerts currently firing — all systems operational.
{% endif %}

Recent Alerts (all statuses)

{% for alert in alerts %} {% else %} {% endfor %}
WATCHCON Severity Title Source Project Status Auto-Healed Created
W{{ alert.watchcon_tier or 4 }} {{ alert.severity }} {{ alert.title }} {{ alert.source }} {% if alert.project_id %} {{ alert.project_id[:12] }} {% else %} — {% endif %} {{ alert.status }} {% if alert.auto_healed %} Yes {% else %} No {% endif %} {{ alert.created_at }}
No recent alerts
{% include "monitoring/_runtime_performance.html" %}

Self-Healing Events

{% for event in healing_events %} {% else %} {% endfor %}
Trigger Source Pattern Action Taken Outcome Duration (s) Escalated To Created
{{ event.trigger_source }} {{ event.pattern_description or '—' }} {{ event.action_taken or '—' }} {% if event.outcome %} {{ event.outcome }} {% else %} — {% endif %} {{ event.duration_seconds or '—' }} {{ event.escalated_to or '—' }} {{ event.created_at }}
No self-healing events recorded
{% endblock %} {% block scripts %} {# The HITL handler MUST stay inside `block scripts`. It sat after the closing endblock tag, and Jinja silently discards anything outside a block in a template that extends a base — so the 14 Rebase/Requeue/Dismiss buttons rendered with no listener attached and clicking them did nothing at all, not even the 'working…' text. Nothing errors; the code is simply absent. #} {% endblock %}