# План: кликабельные индикаторы PASS, PARTIAL, FAIL в разделе «Аналитика» Статус: реализовано, см. [итог](2026-10-04_09-55_analytics-verdict-indicators-summary.md). ## 1. Что нужно Вверху страницы `/analytics` есть ряд индикаторов. Сейчас кликабельны только четыре «прикладных»: «Egress https: есть провалы / все провалены» и «Ingress ssh: есть провалы / все провалены» (открывают окно со списком адресов, есть «Скачать CSV» и «Копировать»). Нужно сделать кликабельными ещё три: **pass**, **partial**, **fail**. По клику открывается тот же диалог со списком адресов с этим вердиктом. Остальные индикаторы («Адресов», «Egress OK», «Ingress OK», «Длительность», «Поздние результаты») остаются как есть: в задаче их нет. ## 2. Решение Новые виды списков строятся по тому же механизму, что и существующие: control-api отдаёт таблицу (JSON или CSV), дашборд проксирует, JS открывает диалог. Новых маршрутов, миграций и новых данных не нужно: вердикт, число проверок и причина `partial` уже вычисляются в `analytics.Compute`. ### 2.1. control-api (`internal/analytics/lists.go`) Три новых вида списка (`kind`): `verdict_pass`, `verdict_partial`, `verdict_fail`. В список входят адреса запуска с этим вердиктом; отменённые (`cancelled`) не входят, как и в остальных списках и в числах `summary`. Порядок — по числовому адресу (`an.sorted()`). Столбцы: | Вид | Столбцы | |---|---| | `verdict_pass` | Адрес, Подсеть, Валидатор, Egress, Ingress, Проверок в цикле | | `verdict_partial` | Адрес, Подсеть, Валидатор, Egress, Ingress, Проверок в цикле, **Причина** | | `verdict_fail` | Адрес, Подсеть, Валидатор, Egress, Ingress, Проверок в цикле | - «Валидатор» — тот же, что в списках https (`ShortValidator`); пусто → «—». - «Egress» и «Ingress» — «успешно из всех» по уровню (`8 из 10`); у уровня без проверок — «—». - «Проверок в цикле» — сохранённых из ожидаемых (`stored из ExpectedChecks`; если ожидаемое неизвестно, только сохранённое). Позволяет сразу увидеть «неполный набор». - «Причина» у `partial` — та же формулировка, что в блоке «Почему partial» (`reasonName`), поэтому строки списка совпадают со столбиками блока. Название CSV: `verdict_pass_run.csv` и т. д. (по общему правилу). Для остальных видов ничего не меняется. Неизвестный `kind` по-прежнему даёт `404`. Инвариант: число строк списка равно числу на карточке (`summary.pass / partial / fail`). ### 2.2. Дашборд (`internal/dashboard/static/analytics.js`, `analytics.css`) - В `renderKpis` у плиток `pass`, `partial`, `fail` в поле списка ставится соответствующий `kind`, плитка становится `