# Changelog пакета forecast

## v1.3.1 — 2026-07-16 (техническая пересборка: вендоренный код)

Числовые результаты прогноза **не изменились** (все контрольные метрики и
допуски идентичны v1.3.0). Пересборка вызвана изменением вендоренного файла
`etl/forecast/run.py`: релиз INF-11 «Пирамида» добавил в него функцию
`export_age_structures()` (экспорт возрастных структур CCMPP для датасета
пирамиды; на выходы прогноза не влияет — проверено байт-сравнением
`forecast.json` и CSV). Опубликованная v1.3.0 неизменяема по стандарту
(ARTIFACT_STANDARD.md §8), поэтому поднята patch-версия.

## v1.3.0 — 2026-07-12 (прогноз v2026.4: вероятностный слой)

Пропорциональный перенос 80% PI WPP заменён **настоящей симуляцией**
Монте-Карло (`etl/forecast/probabilistic.py`). Для каждой из 600
реализаций сэмплируются персистентные отклонения траекторий СКР и ОПЖ от
медианы WPP (по одному шоку z∼N(0,1) на реализацию, амплитуда растёт к
2075), реализация прогоняется через тот же CCMPP, по ансамблю берутся
эмпирические квантили q05…q95. Амплитуды **калиброваны** так, что 80%
интервал страны совпадает с 80% PI WPP-2024 на 2050 (6,7% против 7,1%) и
2075 (16,5% против 16,3%) — на страновом уровне ширина ≈ WPP по
построению. Выгода над переносом — в декомпозиции (веер проходит на
области и возрастную структуру; сумма медиан ≈ страна) и вероятностных
утверждениях по стране: доля из 600 реализаций даёт P(убыль к 2050) =
100% (миграция в веере детерминирована — это внутримодельная частота),
P(<7 млн к 2050) ≈ 8%, P(<6 млн к 2075) ≈ 50%. Области делят общий
национальный шок, поэтому их полосы занижают истинную областную
неопределённость (P по областям не даются). Сид фиксирован (20260712) →
веер воспроизводим байт-в-байт. Медианы и все
сценарии (official и adjusted) идентичны v1.2.0 — изменились только
границы веера. forecast.json получил блок `probabilistic` (калибровка,
статистика, валидация по WPP); CSV переименован в forecast_v2026_4.csv.
Новые инварианты: монотонность веера и калибровочный гейт ≤1,5 п.п.;
30 контрольных метрик (+4 вероятностных). UI: карточка страны показывает
вероятностные утверждения и полосы 80% (q10–q90) / 90% (q05–q95).

## v1.2.0 — 2026-07-11 (прогноз v2026.3: ряд adjusted, WP-F3)

Добавлен второй стартовый ряд **adjusted**: официальные оценки 01.01.2026
минус центральная оценка незарегистрированного оттока 2020–2026
(270 тыс.; интервал 178–416 тыс.), реконструированного из зеркальной
статистики (`etl/mirror.py`): стоки разрешений Eurostat с заменой польской
отчётности на карты UDSC, Литва, Грузия, досчёт ненаблюдаемых направлений
по опросным долям диаспоры (ЦНИ-2023). Поправка распределена по областям
(Минск 62%), возрастам и полу; adjusted публикуется для уровней 0–1.
Гейт приёмки WP-F3: интервал накрывает «сток ВНЖ ЕС минус довоенный сток»
(252 945) и официальный ориентир МВД (350 тыс.). Official-ряды всех
уровней идентичны v1.1.0. Новые входы: data/raw/mirror/* (Eurostat,
UDSC, GUS, опрос ЦНИ — с sha256), adjustment.csv, migration_mirror.csv;
записка docs/notes/adjustment.md. 26 контрольных метрик.

## v1.1.0 — 2026-07-11 (прогноз v2026.2: уровни 2–3, этап 5)

Добавлены районы и города. 118 районов и 5 городов обл. подчинения —
метод Гамильтона–Перри (CCR 2009→2019, shrinkage к областному профилю,
чернобыльский floor по реестру INF-07); 5 облцентров — собственные CCMPP
с имплицированной миграцией; ~190 городов — логистическая доля в районе
(включая Оршу и Полоцк, вошедшие в свои районы к переписи-2019).
Стартовая калибровка к официальным оценкам 01.01.2026; IPF-согласование
с областным CCMPP (сумма районов = область точно). Новые гейты: бэктест
районов 2019→2026 (MAPE 2,12% против 2,76% наивной, 128 территорий) и
городов ≤2009→2019 (6,7% против 10,9%, 188 городов). Уровни 0–1 идентичны
v2026.1 (закреплено инвариантом). 19 контрольных метрик. Новые входы:
data.json (ряды районов/городов), city_raion.csv (привязка native/pip/
manual), chernobyl_zones.csv.

## v1.0.1 — 2026-07-11 (прогноз v2026.1, результаты не изменились)

Исправление входных данных по итогам независимого агентного аудита этапа 4:
в `data/curated/age2009.csv`/`age2019.csv` устранена коллизия territory_id —
внутригородской Октябрьский район Минска ошибочно получал id Октябрьского
района Гомельской области (158 293 чел. с oblast=BY-HM под id r-akciabrski).
На прогноз коллизия не влияла (модель читает только областные строки):
все контрольные метрики, бэктест (−0,41%, MAPE 2,39/4,13) и итоговые файлы
прогноза идентичны v1.0.0. Также исправлена неиспользуемая константа
CURATED в `etl/common.py` пакета.

## v1.0.0 — 2026-07-11 (прогноз v2026.1)

Первый релиз, этап MVP: страна, 6 областей, Минск; горизонт 2026–2075,
шаг 5 лет; сценарии base (по допущениям UN WPP 2024 medium), optimistic,
negative; 80% интервал для базового (перенос PI WPP). Гейты пройдены:
калибровка base-2050 = +1,0% к медиане WPP (порог ±3%); бэктест 2009→2019 —
национальный итог −0,41% (порог ±2%), MAPE 2,39% против 4,13% у наивной
экстраполяции. 11 контрольных метрик.

Перед публикацией пакет прошёл независимый агентный аудит: все метрики
воспроизведены байт-в-байт, детерминизм подтверждён повторным прогоном;
по итогам уточнена формулировка стресса допущения внутренней миграции
в AGENT.md (композиционный дрейф национального итога до ±0,2%).
