Решили: обзор баланса обязан различать «все киты в коридоре» и «норм в этом прогоне нет». Раньше оба случая давали одну надпись — «Все киты внутри своих коридоров».

Почему: нормы пишет не всякий бенч. Из тридцати прогонов в отчётах они есть у четырнадцати, и у выбранного ПО УМОЛЧАНИЮ (самого свежего) их нет. Список «Кто выпадает из роли» строится по посчитанным отклонениям, поэтому при отсутствии норм он пустел — и пустота печаталась как зелёный свет. Это ответ на незаданный вопрос: ноль вычисленных отклонений означает «сравнивать не с чем», а не «всё хорошо».

Нашлось случайно: живое превью для карточки «Баланса» показало все двадцать восемь китов ровно на нуле шкалы. Картинка выглядела странно, замер объяснил почему — deviation() вернула null двести восемьдесят раз подряд и ни одного значения.

Грабли: сравнивать живые сцены Лаборатории хешем скриншота нельзя — два кадра подряд отличаются и без единой правки, потому что сцена тикает. Детерминированный кадр даёт только ?shot= с фиксированным -Frame; он же, наоборот, не ждёт асинхронных данных, и снимок стенда, живущего на фиде, выходит пустым. Эквивалентность кода проверяется численно (прогнать обе формулы по сетке точек), а не глазами по картинке.

Владелец правды: docs/lab/src/sections/balance-overview.ts — функция spread() и блок «Кто выпадает из роли»; источник норм — normsOf() в docs/lab/src/lib/balance-data.ts.