К основному содержимому
Знак Repo Vitals: пульс, который кончается коммитомREPO VITALS

Как считается балл

Шесть категорий дают вместе 100 баллов. Пороги не зависят от дня: одно состояние проекта всегда даёт один и тот же балл.

Из чего складывается 100

вклад категории = её вес × доля набранного внутри

Три правила, которые защищают от несправедливой оценки

Нет данных — не штрафуем

Если категорию негде спросить, балл за неё не снижается. Её вес делится между остальными. Так же не штрафуем зеркало с GitHub за отсутствие политик веток и ревью: настроить их здесь нельзя. Настроенную политику учитываем как есть. Зеркало — это включённое зеркалирование площадки. Импортированный с GitHub репозиторий, зеркалирование которого остановлено, считается как обычный.

Отказ сбора — интервал, а не ноль

Мы спросили, а ответа нет. Тогда балл становится интервалом «от и до», а не нулём.

Один сигнал не топит проект

Самая тяжёлая категория весит 20 из 100. Зрелый проект остаётся высоко даже при редких коммитах.

Шесть категорий

коснитесь категории, чтобы увидеть её метрики и шкалы
READMEесть раздел быстрого старта — 100 баллов, полный — 60, короткий — 30, нет — 0
Файл лицензииесть — 100 баллов, нет — 0
Каталог тестовесть — 100 баллов, нет — 0
Каталог документацииесть — 100 баллов, нет — 0
Dockerfileесть — 100 баллов, нет — 0
Файл блокировки зависимостейесть — 100 баллов, нет — 0
Инструкция для контрибьюторовесть — 100 баллов, нет — 0
Политика защиты ветокстрогая — 100 баллов, есть — 60, нет — 0
Политика ревьюстрогая — 100 баллов, есть — 60, нет — 0
Доля коротких сообщений коммитов0 % — 100 баллов, 20 % — 80, 50 % — 50, 100 % — 0

Что смотрим: дерево репозитория и настройки площадки. Если площадка отдала дерево не целиком, ненайденный файл получает «не проверено», а не «нет». За отсутствие политик веток и ревью зеркало с GitHub не штрафуем: метрика выбывает.

Последний коммит30 дней и меньше — 100 баллов, 115 дней — 75, 202 дня — 50, 279 дней — 25, 365 дней и больше — 0
Коммиты за год25 и больше — 100 баллов, 8 — 75, 3 — 50, 1 — 25, 0 — 0
Активность по неделям8 недель и больше — 100 баллов, 4 недели — 80, 2 недели — 55, 1 неделя — 30, 0 недель — 0
Доля коммитов автора-лидера50 % и меньше — 100 баллов, 58 % — 85, 75 % — 60, 93 % — 25, 100 % — 0
Уникальные авторы4 и больше — 100 баллов, 3 — 80, 2 — 50, 1 и меньше — 0
Последний релиз30 дней и меньше — 100 баллов, 115 дней — 75, 202 дня — 50, 279 дней — 25, 365 дней и больше — 0, релизов и тегов нет — 0
Доля pull request'ов без ответа0 % — 100 баллов, 25 % — 60, 50 % — 20, 75 % — 0, 100 % — 0
Доля закрытых pull request'ов100 % — 100 баллов, 50 % — 50, 0 % — 0

Окно наблюдения — 365 дней.

Что смотрим: коммиты, авторов, релизы и pull request'ы за окно. Отклик считаем по первой странице списка и только при достаточном числе объектов. По одному-двум судить рано, и метрика выбывает.

Публично не видно ничего: отчёты сканера площадка отдаёт только участникам репозитория (403 по правам, замер 15.09.2026). Поэтому у публичной строки категория — «нет данных», а её вес уходит остальным. Разбор находок по важности и состоянию включается при входе в свой репозиторий.

Конфигурация CI SourceCraftесть — 100 баллов, нет — 0
Состав конфигурации CIстрогая — 100 баллов, есть — 60, нет — 0
Прогоны CI95 % и больше — 100 баллов, от 80 % до 95 % — 75, от 50 % до 80 % — 40, меньше 50 % — 0

«прогоны CI» считается только в приватном анализе, токеном владельца: окно — 90 дней, не больше 50 последних наблюдений; меньше 5 — метрика не применяется и вес уходит соседям. Ступени шкалы — норматив от 23 сентября 2026 г., а не калибровка по корпусу.

Что смотрим: файл сборки и его триггеры, а в приватном анализе — ещё и итоги прогонов (доля успешных среди завершившихся). Чего не видим публично: итоги прогонов — площадка отдаёт их только участникам репозитория (403 по правам, замер 15.09.2026). Поэтому у публичной строки метрика прогонов всегда «сбор отказал» — закрыто площадкой, — а категория «оценено частично». Если сам конфиг прочитать не удалось, категория — «сбор отказал». Смотрим только конфиг площадки (.sourcecraft/ci.yaml); внешний CI (GitHub Actions и др.) не проверяется.

Доля задач без ответа0 % — 100 баллов, 25 % — 60, 50 % — 20, 75 % — 0, 100 % — 0
Возраст открытых задач30 дней и меньше — 100 баллов, 120 дней — 75, 242 дня — 50, 423 дня — 25, 540 дней и больше — 0
Время закрытия задач0 дней — 100 баллов, 2 дня — 80, 9 дней — 60, 36 дней — 30, 90 дней и больше — 0

Отклик по «время закрытия задач» считаем по выборке до 50. Нужно не меньше 3 подходящих объектов: по одному-двум судить рано, и метрика выбывает. «возраст открытых задач» — пороги — квантили каталога: 609 репозиториев, замер 15 сентября 2026 г. «время закрытия задач» — пороги — квантили каталога: 240 репозиториев, замер 15 сентября 2026 г.

Что смотрим: задачи в трекере и время ответа на них. Трекер включён не у всех: у 97,5 % публичного каталога он пуст (замер по полному каталогу 15.09.2026). Тогда спрашивать нечего, и категория уходит в «нет данных», а не в ноль.

Плотность пометок TODO/FIXME0 на тысячу строк — 100 баллов, 0,5 на тысячу строк — 85, 1,2 на тысячу строк — 60, 4 на тысячу строк — 35, 25 на тысячу строк и больше — 0

«плотность пометок TODO/FIXME» — пороги — квантили 372 ненулевых наблюдений из 13 766 репозиториев каталога, замер 17 сентября 2026 г.

Что смотрим: все файлы кода из собранного дерева, без усечения выборки. Пометок долга нет почти у всех репозиториев замера. Поэтому середина шкалы стоит на квантилях тех, у кого они есть: иначе шкала мерила бы редкое исключение.

Грейды

нижняя граница балла
  • A85+отлично
  • B70+хорошо
  • C55+неплохо
  • D40+есть куда расти
  • Fниже 40начало пути

Балл-интервал показываем парой букв: грейд нижней и верхней границы, например C–B. Цвет берём по нижней.

Интервал и покрытие

интервал честнее точки
  • оценено
    84
  • оценено частично
    61–78
  • не оценено
    —

Если метрику не удалось измерить, балл становится интервалом: от «всё потеряно» до «всё набрано». Покрытие — доля веса рубрики, которую удалось применить. Ниже 60 % оценка считается частичной, даже если границы интервала совпали. Пустой репозиторий не оцениваем вовсе. Репозиторий с давно не обновлёнными данными тоже: вместо устаревшего балла стоит «не оценено».

65 из 100покрытие типичной строки

Столько веса удаётся применить к публичному репозиторию. Безопасность и Задачи спросить негде, их вес переходит остальным 4 категориям. Полной оценки на публичных данных не бывает: статусы прогонов CI закрыты. Поэтому вместо «оценено / частично» мы показываем покрытие числом.

Интервал честнее точки: он показывает, сколько мы не смогли измерить, и не рисует точку там, где её нет. Место в рейтинге считаем по нижней границе интервала, то есть только по доказанному. Середину не берём: иначе репозиторий, у которого площадка отдала меньше данных, стоял бы в рейтинге выше, чем показывают измеренные данные. У крупных репозиториев диапазон обычно шире: площадка чаще отдаёт их данные не целиком — дерево файлов, длинная история, большой трекер, — и неизмеренного веса у них больше.

Что сознательно не входит в балл

видно участникам
Прогоны CI и находки AppSec. Публично их не отдаёт никто; в своём репозитории они считаются полностью.
пусто у всех
Звёзды репозитория. Поле каталога пусто у каждой записи площадки.
контекст
Лайки площадки. Оценка читателей площадки — показана рядом с баллом отдельной колонкой. документация SourceCraft о рейтинге репозиториев (на английском).
показано отдельно
Число сопровождающих в списке. Участники — по данным SourceCraft, а не подписи git: у одного человека бывает несколько адресов почты, и склеивать их по домену нельзя. Участники площадки в балл не входят — там считаются авторы коммитов, метрикой категории «Активность».

Калибровка порогов

дата3 сентября 2026 г.
репозиториев в выборке1 713калибровочный корпус; в снимке рейтинга 29 710
выборка изравномерной страты каталога

Середины шкал стоят на квартилях выборки, края заданы вручную: «30 дней — ещё свежо», «год — уже давно».

Дата и выборка выше — только для шкал без своей подписи; у остальных свой замер (4 метрики), он назван в строке метрики.

Как складывается балл

четыре шага от значения метрики до буквы грейда
  1. Значение метрики переводим в 0–100 по её шкале. Между узлами — линейно, за крайними узлами — плато.
  2. Баллы метрик внутри категории усредняем по их весам: сумму «балл × вес» делим на сумму весов.
  3. Долю категории умножаем на её вес. Вклады шести категорий складываем в число от 0 до 100.
  4. По этому числу берём грейд по границам грейдов. У интервала буква считается для каждой границы, и рядом с баллом стоит пара.

Категория без данных и метрика без ответа считаются иначе. Оба случая описаны выше, в трёх правилах.

Отклик и трекер: что считается ответом

определения по текущему коду сбора
Ответ
Первый комментарий человека, чей автор известен и не совпадает с автором pull request или задачи. Комментарии код-ассистента и удалённые комментарии не считаются.
Кто не попадает в знаменатель
Объекты, которые не удалось прочитать целиком, и объекты с неизвестным автором комментария. Про них нельзя сказать ни «ответили», ни «нет».
Минимальный знаменатель
Порог виден в подписи раскрытой категории, из того же ответа, что и шкалы. На меньшей выборке доля «без ответа» скачет, и балл мерил бы выборку, а не проект. Если выборка меньше порога потому, что её не дочитали — прогон остановлен или площадка отказала по части целей, — метрика уходит в «недоступно» с интервалом, а не выбывает из счёта.

Как часто пересчитывается

Сервис рассчитан на суточный пересчёт каталога. Обновляются репозитории, которые изменились с последнего удачного сбора. Остальные остаются в снимке с прежними данными и прежним временем анализа.

Четыре состояния категории

чип состояния стоит в строке категории на карточке репозитория
оценено
Все применимые метрики измерены. Вклад категории посчитан целиком.
частично
Часть метрик измерить не удалось. Вес категории остаётся полным, а неполноту показывает покрытие числом.
нет данных
У этого репозитория спросить негде: ни одной применимой метрики, например трекер выключен или поверхность закрыта. Вес уходит остальным категориям, штрафа нет.
сбор отказал
Метрики применимы, но измерить не удалось ни одной. Вес учтён по нижней границе, и балл становится интервалом.