# Changelog пакета grid

## v1.1.0 — 2026-07-28 (MINOR — данные обновлены, выводы не изменились)

Доработка по итогам аудита UX/копирайтинга `docs/notes/
grid_ux_audit_2026-07-27.md` и распоряжения `handoff/09_next_research/
INF-15_grid_fix_order.md` (полная сводка решений — `docs/decisions/
INF-15.md`, записи D-009/D-010).

**Данные (влияет на числа пакета).**
- Обнаружена и исправлена деградация трека центра масс в 1897/1913/1926/
  1939/1959 годах: `centroid_pre_grid()` усреднял по единственному району
  с полными данными (BY-HM), из-за чего трек молча вырождался в
  координаты Минска, не отражая реальное отсутствие данных (D-009).
  Исправление: районное взвешивание оставлено только для 1970 года
  (первый год с полным покрытием 118/118 районов); 1897 год — отдельная
  оценка по городскому населению переписи 1897 года
  (`data/raw/shocks/census_lang.json`, источник Демоскоп/INF-09), с
  расширенным до ±40 км коридором погрешности (был общий ±25 км для всех
  дореволюционных лет без разбора). Побочный эффект — G-5 (устойчивость
  центра масс) снизился с 2,03 км до **1,08 км** (тот же допуск 15 км,
  тест по-прежнему пройден увереннее).
- Трек центра масс достроен реальными прогнозными точками до 2050 года
  (канонический прогноз base/A) — методблок §2 «трек 1897–2050» теперь
  буквально верен, ранее обрывался на 2020 году.
- Кадры карты `grid_frames/`: добавлен режим «класс плотности» — ещё 46
  кадров `density_*.webp` (4 плоских класса по порогам пререгистрации),
  `frames` в `grid.json` реструктурирован из плоского словаря в
  `{pop: {...}, density: {...}}` (см. обновлённый `DATA_DICTIONARY.md`).
  `grid.json` — 205,2 КБ (было 201,8 КБ, бюджет 1536 КБ).

**Интерфейс страницы `/research/grid` (не влияет на числа пакета).**
Дискретный ползунок по 16 узлам данных вместо непрерывного шага в 1 год
(60 из 76 прежних положений указывали на несуществующие кадры); режим
«метры сети на жителя» подключён к хороплету районов; обработчик клика
по клетке переведён на актуальный год (был захвачен в замыкание при
монтировании карты и всегда показывал год первого рендера); кнопка ▶
(автовоспроизведение); легенда для каждого режима; коридор погрешности
и подписи лет у трека центра масс; текст страницы дополнен блоками «как
читать карту», «главная находка» (плотность vs плотность вокруг среднего
жителя), результатом по дорожной сети (ранее отсутствовал на странице
полностью), источниками и чипами статуса утверждений.

**Контрольные метрики.** `checks/expected_results.json` — 26 записей
(было 20): добавлены `national_arith_density_1975`, `national_below1_2020`,
`national_below5_2050_base_A`, `national_pw_density_2050_base_A`,
`settlement_components_largest_area_share_2020`, `g6_road_km_official`
(числа, впервые вынесенные на страницу этой доработкой); `g5_max_shift_km`
обновлён с 2,03 на 1,08 (см. выше).

Выводы C-1/C-2 (открытый вопрос) и C-3 (подтверждено) не изменились.

## v1.0.0 — 2026-07-26

Первый релиз INF-15 «Полотно: карта расселения Беларуси по сетке 1 км,
1975–2050».

Состав. Единая сетка 1 км (857×514 клеток, 119 территорий = 118 районов +
г. Минск), проекция ESRI:54009 (Молльвейде, равноплощадная — НЕ EPSG:3857
из примера Приложения А ТЗ, решение `docs/decisions/INF-15.md` D-001).
Наблюдаемый ряд — 10 эпох GHS-POP R2023A (1975–2020, шаг 5 лет), клетки
откалиброваны под официальные ряды районов Белстата (constrained dasymetric
redistribution, D-005 — сырой продукт не проходит сверку G-1 на 119 из 119
территорий). Прогнозная часть — 2026–2050 (6 узлов, 2050 — интерполяция),
3 сценария (base/optimistic/negative) × 2 варианта распределения внутри
района (A «инерция» / Б «пригороды-периферия», D-006). Дополнительный слой
— `network_per_capita` (метры дорожной сети на жителя, снимок OSM 2026
года) и перекрёстная проверка с ночной светимостью VIIRS (только для
проверки G-3, не как слой карты).

Три утверждения пререгистрации: **C-1** (population-weighted density растёт
быстрее, чем пустеет территория) и **C-2** (доля площади с плотностью
<5 чел/км² растёт монотонно 1975→2050, не сводится к Полесью/Чернобылю) —
статус **«открытый вопрос»**, не «подтверждено», из-за провала перекрёстной
проверки G-3 (согласие знака население/огни 2012→2020 = 32,8 % при пороге
70 %, `docs/decisions/INF-15.md` D-007). **C-3** (сети на жителя больше там,
где депопуляция сильнее) — статус **«подтверждено»**: Spearman ρ = −0,7508
(p ≈ 1,25×10⁻²², 118 районов), проверка полноты карты дорог G-6 пройдена
(OSM 76 958,8 км против официальных 86 446,0 км, Δ = −10,97 %, допуск
±15 %).

Канонические числа (`data/final/computed_results.json`, 20 метрик): доля
площади страны с плотностью <5 чел/км² выросла с 0,7155 (1975) до 0,7422
(2020); плотность, взвешенная по населению, — с 3105,573 до 5657,336
чел/км²; арифметическая плотность страны упала с пика 48,883 (1990) до
44,882 (2020); число «островов» расселения (порог 1 чел/км², 8-связность)
— 3685 в 2020 году, доля населения в крупнейшем — 0,4547; рост доли
опустевшей территории без 36 районов Полесья/Чернобыля — +0,0292 (G-4
пройдена); максимальный сдвиг центра масс при альтернативных весах —
2,03 км (G-5 пройдена, допуск 15 км); прогноз клеток сходится с прогнозом
районов с точностью 0,0 % на 4284 проверках (G-2 пройдена).

Восемь проверок раздела 7 ТЗ (полный протокол — `VALIDATION.md`): пройдены
G-2, G-4, G-5, G-6, G-7, G-8; G-1 не пройдена сырым продуктом и исправлена
constrained-калибровкой (проходит «по построению» после исправления, не
как исходный эмпирический тест); G-3 **не пройдена** (32,8 % < 70 %) — с
предписанным разделом 7 ТЗ честным fallback'ом (C-1/C-2 → «открытый
вопрос»), применённым без исключений во всех текстах пакета.

Воспроизведение: `bash code/run.sh` — пересчёт `data/final/
computed_results.json` из вендоренных агрегатов на стандартной библиотеке
за секунды, с прогоном инвариантов и сверкой 20 контрольных чисел; полный
растровый режим (GHS-POP → клетки → метрики → прогноз → кадры) — пять
модулей `etl.grid_fetch` → `etl.grid_extract` → `etl.grid` →
`etl.grid_project` → `etl.grid_frames` (плюс независимый `etl.grid_network`
для G-6/C-3), запускаются из корня основного репозитория с
`requirements-raster.txt`, см. README.md. Глобальные тайлы GHS-POP (~190 МБ)
не вендорятся (URL + sha256 всех 40 тайлов в `sources/raw/
registry_ghsl_pop.csv`).

Ограничения зафиксированы в `LIMITATIONS.md`: карта — не независимый
источник численности населения (итоги районов/страны тождественно равны
официальным после калибровки); малозаселённые/эвакуированные зоны искажены
дазиметрией сильнее прочих (до +209,78 % на отдельной эпохе в Брагинском
районе, сырой продукт); нерешённый подрайонный confound «города-хозяева
против пригородов» (условие третьего проверяющего при ревью D-005,
`docs/notes/grid_validation.md`, доведено частично, не до конца); снимок
дорожной сети содержит только 5 из 8 классов OSM; операциональный (не
строго физико-географический) список 27 полесских районов; прогноз
опирается на явно стилизованное допущение о продолжении внутрирайонного
тренда (вариант A) либо о пригородно-периферийной корректировке
(вариант Б); дороги — снимок 2026 года, не история.

`DATA_DICTIONARY.md` описывает контракт `web/public/data/grid.json` для
переиспользования следующим исследованием (INF-14): систему координат
(ESRI:54009, не EPSG:3857 — расхождение с примером Приложения А явно
объяснено), стабильность идентификаторов ячеек (индекс `(row, col)` в
едином, зафиксированном во всех эпохах `grid.transform`) и честно фиксирует
незавершённое на момент релиза решение D-003 (способ клиентского чтения
значения отдельной ячейки — выбирается разработчиком страницы на этапе 6,
`web/lib/grid.ts` на момент написания этого документа не создан).
