Калибровка: сверка прогнозов с фактом
Это самая важная страница раздела. Все предыдущие методы дают прогнозы — а калибровка отвечает на вопрос, который задаёт любой скептик (и любая аттестационная комиссия): а работает ли это вообще?
Зачем это
Формула без проверки — это просто код. Формула, сверенная с реальностью, — это исследование. Калибровка превращает «у нас есть Монте-Карло» в «наш метод прогнозирования проверен на 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% исходов.
Доля попаданий считается прямо:
В знаменателе только засчитанные спринты: попадания, промахи и переносы. Спринты без данных об исходе в расчёт не входят.
Отклонение от ожидаемого — диагноз:
- сильно ниже 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, попадают в журнал с пометкой «закрыт до обновления» и в калибровке не участвуют: у них не записан состав на момент закрытия, а пересчитывать исход задним числом было бы нечестно. Доверие к прогнозу строится на накопленной истории, а не на обещаниях.