# Changelog пакета grid

## v1.2.0 — 2026-07-28 (MINOR — новые данные и находка, старые выводы не изменились)

Доработка по итогам брифа `handoff/09_next_research/INF-15_grid_v2_brief.md`
(режим «История», гигиена интерфейса, проверка варианта A — полная сводка
решений `docs/decisions/INF-15.md`, записи D-013/D-014).

**Находка (главное в этой версии).** Независимо перепроверена и
подтверждена концентрация населения района внутри его же клеток: доля
населения района в топ-5 самых плотных клетках почти не менялась
эмпирически за 45 лет (25,6%→25,8%, 1975→2020), но прогноз (сценарий
base, оба варианта A/Б) даёт скачок до ~55% к 2050 году. Причина — не
ошибка в данных, а самоусиление log-linear (экспоненциальной) экстраполяции
по отдельной клетке при переносе за пределы окна подгонки; G-2 не ловит
это, т.к. сверяет только сумму клеток района, не форму распределения
внутри. Добавлена новая проверка **G-9** (`docs/preregistration/
grid-v0.2.md`, `validation.g9_concentration_check` в `grid.json`) —
честно **не пройдена** по конструкции (62 из 118 районов, `pass: false`);
оговорка про «плотность вокруг среднего жителя» на странице усилена, а не
сокращена. Пересчёт самой модели прогноза (изменение формы экстраполяции)
явно оставлено вне охвата этой доработки — будущий шаг.

**Данные (влияет на числа пакета).**
- Новый файл `sources/raw/story_metrics.json` (← `etl/grid_story.py`):
  6 полос по плотности клетки (гипотеза **C-004**, «правило пятисот» —
  подтверждена точным независимым пересчётом), 5 полос по расстоянию до
  магистрали (гипотеза **C-005** — статус «открытый вопрос», качественный
  градиент подтверждён, но метод растеризации даёт малые расхождения с
  районной проверкой), площадь половины населения по трём эпохам,
  ранжирование районов по изменению 1975→2020 (топ-8 + полный список всех
  119 территорий `by_id`), классы чернобыльских зон по району.
- Новый файл `sources/raw/g9_concentration_check.json` (← `etl/
  grid_project.py::compute_g9_concentration_check`) — полный разрез
  проверки G-9 по каждому из 118 районов.
- Новый слой `web/public/data/geo/grid_highways.geojson` (662,8 КБ) —
  геометрия дорожной сети INF-04 для карты (не для чисел — числа в
  `c005_highway_distance`).
- `grid.json`: `meta.claims`/`claims_status` расширены до `["C-001"…
  "C-005"]` (C-004 «подтверждено», C-005 «открытый вопрос»);
  `validation.g9_concentration_check` — новая сводка (полный разрез только
  в сыром артефакте, не раздувает `grid.json`).

**Интерфейс страницы `/research/grid` (не влияет на числа пакета).**
Режим «История» — 7 пошаговых сцен с готовыми пресетами карты (год,
метрика, сценарий, bbox, оверлей), deep-link `?story=N`, переключатель
«История/Свободно» (порт механики с `/research/nightlights`, не
переизобретение); свободный режим сохранён полностью, история не
подменяет исследование презентацией. Гигиена: ▶ увеличена до отдельной
кнопки 46px с подписью под картой, слитый слайдер вместо двух
индикаторов (ползунок + декоративный трек), по-кнопочные RU-подсказки,
блок «как читать карту» убран сверху и распределён по элементам.
Ни один шаг истории не утверждает больше, чем позволяет
`meta.claims_status`; оговорка про дазиметрический метод не сокращена
(особенно на шаге 3 про дороги); отрицательный результат G-3 остаётся на
видном месте в обоих режимах.

**Контрольные метрики.** `checks/expected_results.json` — 51 запись (было
26): добавлены 6 записей C-004, 5 записей C-005, 3 записи площади половины
населения, 4 записи по районам-экстремумам, 7 записей G-9. Все выводы
C-1/C-2 (открытый вопрос) и C-3 (подтверждено) из v1.0.0/v1.1.0 не
изменились; добавлены C-4 (подтверждено) и C-5 (открытый вопрос).

## 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` на момент написания этого документа не создан).
