{% extends "base.html" %} {% block title %}Triage - craft-dashboard{% endblock %} {% block content %} {% include "stats/partials/tabs.html" %}

Triage

Contributor review queues, response SLAs, untriaged backlog health, and LLM classification across tracked projects.

Contributor PRs

Awaiting review
{{ velocity.first_response_waiting_count }} / {{ velocity.contributor_count }} open
Time to 1st response
{{ velocity.first_response_avg_days or '—' }} days
{% if velocity.first_response_avg_delta is not none and velocity.first_response_avg_delta != 0 and velocity.first_response_avg_baseline is not none %} {% set f_abs = velocity.first_response_avg_delta | abs %} {% set f_dir = 'higher' if velocity.first_response_avg_delta > 0 else 'lower' %} {% set f_tip = f_abs ~ " days " ~ f_dir ~ " than the " ~ velocity.first_response_avg_baseline ~ " day baseline (the monthly average over the last 12 months)" %} {{ '+' if velocity.first_response_avg_delta > 0 else '' }}{{ velocity.first_response_avg_delta }}d vs 12m avg {% elif velocity.first_response_avg_delta is not none %} {{ '+' if velocity.first_response_avg_delta > 0 else '' }}{{ velocity.first_response_avg_delta }}d vs 12m avg {% endif %}
Contributor avg age
{{ velocity.contributor_avg_age or '—' }} days
{% if velocity.contributor_avg_delta is not none and velocity.contributor_avg_delta != 0 and velocity.contributor_avg_baseline is not none %} {% set c_abs = velocity.contributor_avg_delta | abs %} {% set c_dir = 'higher' if velocity.contributor_avg_delta > 0 else 'lower' %} {% set c_tip = c_abs ~ " days " ~ c_dir ~ " than the " ~ velocity.contributor_avg_baseline ~ " day baseline (the monthly average over the last 12 months)" %} {{ '+' if velocity.contributor_avg_delta > 0 else '' }}{{ velocity.contributor_avg_delta }}d vs 12m avg {% elif velocity.contributor_avg_delta is not none %} {{ '+' if velocity.contributor_avg_delta > 0 else '' }}{{ velocity.contributor_avg_delta }}d vs 12m avg {% endif %}

Contributor PRs awaiting maintainer review

{% if awaiting_prs %} {% for row in awaiting_prs %} {% endfor %}
Repository PR # Title Author Waiting
{{ row.project_name }} {% if row.url %} #{{ row.external_id }} {% else %} #{{ row.external_id }} {% endif %} {% if row.url %} {{ row.title }} {% else %} {{ row.title }} {% endif %} {{ row.author or '—' }} {{ row.days_waiting }}d
{% else %}

All open contributor pull requests have received maintainer review.

{% endif %}

Untriaged backlog

{{ application_projects|length + library_projects|length + other_projects|length }} tracked projects {% if healthy_project_count > 0 %}
{{ healthy_project_count }} healthy (< 5)
{% endif %} {% if attention_project_count > 0 %}
{{ attention_project_count }} attention
{% endif %} {% if overdue_project_count > 0 %}
{{ overdue_project_count }} overdue
{% endif %}
View all untriaged issues →
{% for cat_title, cat_rows in [('Applications', application_projects), ('Libraries', library_projects), ('Other', other_projects)] %} {% if cat_rows %} {% for row in cat_rows %} {% endfor %} {% endif %} {% endfor %}
Repository Open Issues Open PRs Untriaged Issues Untriaged PRs Triage Health
{{ row.name }} {{ row.open_issues }} {{ row.open_prs }} {% if row.untriaged_issues > 0 %} {{ row.untriaged_issues }} {% else %} 0 {% endif %} {% if row.untriaged_prs > 0 %} {{ row.untriaged_prs }} {% else %} 0 {% endif %} {% if row.badge_color == 'green' %}Healthy{% elif row.badge_color == 'yellow' %}Attention{% elif row.badge_color == 'red' %}Overdue{% else %}Clean{% endif %}

LLM classification

{{ evaluated_count }} of {{ total_open }} open issues and PRs have been evaluated.

{% if action_counts %} {% for action, count in action_counts.items() | sort %} {% endfor %}
Suggested Action Count
{{ action | replace("_", " ") }} {{ count }} View items →
{% else %}

No evaluations yet. Run scripts/run_llm.py to triage open issues.

{% endif %}
{% endblock %} {% block scripts %} {% endblock %}