Калибровка: сверка прогнозов с фактом

Это самая важная страница раздела. Все предыдущие методы дают прогнозы — а калибровка отвечает на вопрос, который задаёт любой скептик (и любая аттестационная комиссия): а работает ли это вообще?

Зачем это

Формула без проверки — это просто код. Формула, сверенная с реальностью, — это исследование. Калибровка превращает «у нас есть Монте-Карло» в «наш метод прогнозирования проверен на N спринтах и попадает в цель в X% случаев». Разница принципиальная.

Журнал прогнозов

Чтобы что-то сверять, прогнозы надо зафиксировать в момент, когда они сделаны — иначе задним числом всегда кажется, что «мы так и думали». Такт ведёт журнал снапшотов прогноза:

  • Якоря. На старте спринта пишется снапшот sprint_start, при закрытии — sprint_close. Эти две точки гарантированы: без них калибровать было бы нечего.
  • Дневная серия. Раз в сутки фоновая задача снимает снапшот каждого активного спринта — чтобы видеть, как прогноз менялся по ходу дела. Технически это отдельная периодическая задача (cron в 03:00 UTC): она обходит все рабочие пространства, находит активные спринты и снимает по снапшоту, но не чаще одного в сутки на спринт (повторный запуск в тот же день ничего не дублирует). Сбой на одном спринте не срывает обход остальных.

Вся математика продукта сходится именно здесь:

  история закрытых задач
        │  (перцентили P10/P50/P90)
        ▼
   PERT-оценки O/M/P ──► сеть зависимостей (CPM) ──► критический путь
                                  │
                                  ▼
                   Монте-Карло (5000 прогонов) ──► P50 / P85 / P95
                                  │
              снапшот на старте ──┤── дневные снапшоты ──┐
                                  ▼                      ▼
                          факт при закрытии ──► «прогноз vs факт»
                                  │
                                  ▼
                    калибровка: доля попаданий в P85

Что считается фактом

Прогноз на старте отвечает на вопрос «за сколько дней будут закрыты все задачи состава». Значит, факт должен отвечать на тот же вопрос. Сравнивать прогноз с календарной длиной спринта нельзя: спринт обычно закрывают по каденции, даже если часть задач не доделана, и метрика показывала бы «100% попаданий» просто потому, что спринт всегда закрывают вовремя.

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

ИсходУсловиеФактЗасчитывается
попаданиевсе задачи состава закрыты, последняя не позже P85день закрытия последней задачи − стартда
промахвсе задачи закрыты, но последняя позже P85то жеда
переносхотя бы одна задача перенесена, возвращена в бэклог или оставлена незакрытойнетда, как промах по P50 и P85
нет данныхспринт закрыт до обновления, состав на закрытии не записаннетнет

Перенос считается промахом сознательно: модель обещала закрыть всё, и если команда выбрала срезать скоуп, обещание не выполнено. Это строже, чем «уложились в спринт», зато калибровке можно верить.

Прогноз vs факт

Когда спринт закрывается, Такт сравнивает его стартовый прогноз с исходом. На карточке закрытого спринта и в отчёте появляется строка вида:

P85 на старте: 12 дн · факт 10 дн · ошибка −2 дн · попадание

или, если состав закрыт не целиком:

P85 на старте: 12 дн · перенесено задач: 2 · перенос

Система отчитывается за свои обещания, это и есть петля доверия.

Что такое честная калибровка

Ключевая идея: если модель честная, то в свой P85 должно укладываться примерно 85% спринтов, а в P50 — примерно 50%. Это не совпадение, а определение перцентиля: P85 по построению — тот срок, который перекрывает 85% исходов.

Доля попаданий считается прямо:

hit rateP85=#{спринтов: исход=попадание}#{засчитанных спринтов}\text{hit rate}_{P85} = \frac{\#\{\text{спринтов: исход} = \text{попадание}\}}{\#\{\text{засчитанных спринтов}\}}

В знаменателе только засчитанные спринты: попадания, промахи и переносы. Спринты без данных об исходе в расчёт не входят.

Отклонение от ожидаемого — диагноз:

  • сильно ниже 85% — оценки систематически оптимистичны (обещаем быстрее, чем выходит);
  • сильно выше 95% — перестраховка (можно обещать смелее).

Границы применимости

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

Засчитано спринтовСтатус
0–4мало данных для выводов, проценты скрыты
5–9выборка небольшая, к процентам относиться осторожно
10 и большевыборка достаточная

Рядом с фактической долей всегда стоит ожидаемая («P85: ожидалось ~85%, у вас 60% на 7 спринтах»), чтобы сравнение было с нормой, а не с нулём.

Журнал и экспорт

У каждой доски есть страница «Журнал прогнозов». Сверху полоса калибровки, ниже спринты: активные первыми, у каждого снапшоты по точкам (старт, ежедневные, закрытие) с P50/P85/P95, шансом в срок, наивным шансом и остатком задач. У закрытых спринтов виден исход, у спринтов с тремя и более прогнозными снапшотами рисуется мини-график сходимости P85.

Меню «Экспорт» отдаёт два датасета, каждый в CSV (с BOM и разделителем ;, чтобы русский Excel открыл без настроек) и в JSON:

  • журнал снапшотов – каждая строка один снапшот со всеми параметрами, включая PERT-ожидание и сигму, размер выборки и число рёбер сети;
  • калибровка – одна строка на закрытый спринт: прогноз на старте, факт, исход, состав.

Именно из этих двух файлов строится доказательная база дипломной части: калибровка P50/P85 (гипотеза H1) и сравнение сетевого прогноза с наивным (H2) считаются по ним, а не по словам.

График сходимости

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

Где увидеть

  • «Прогноз vs факт» — на карточке каждого закрытого спринта и в его отчёте, с исходом.
  • «Точность прогнозов» — карточка в аналитике: исход по каждому закрытому спринту и сводная калибровка P50 / P85 с границами применимости.
  • «Журнал прогнозов» — страница доски: все снапшоты, полоса калибровки, экспорт.
  • «Сходимость прогноза» — график на карточках спринта (появляется, когда набралось хотя бы три снапшота).
Карточка «Точность прогнозов» в аналитике: сверка обещаний с фактом по всем закрытым спринтам.

Честная оговорка: данные калибровки копятся со временем. Спринты, закрытые до обновления 0.2, попадают в журнал с пометкой «закрыт до обновления» и в калибровке не участвуют: у них не записан состав на момент закрытия, а пересчитывать исход задним числом было бы нечестно. Доверие к прогнозу строится на накопленной истории, а не на обещаниях.