# Пререгистрация INF-15 «Полотно» (grid) — v0.1

**Дата заморозки:** 2026-07-26 (до выполнения каких-либо расчётов метрик по
клеткам; тайлы GHS-POP на этот момент скачаны и лежат в некоммитируемом
кэше `data/raw/ghsl/tiles/`, но НИ ОДНА метрика ещё не считана).
**Статус:** заморожена. Изменения — только датированными поправками в конце файла.
**ТЗ-основание:** `handoff/09_next_research/BY_Maps_INF-15_grid_research_spec.md`
(версия 0.2, 2026-07-26).

## 1. Главный исследовательский вопрос

Как устроено расселение Беларуси, если смотреть на него без административных
границ — сеткой в один километр — и как рисунок этого расселения менялся с
1975 по 2020 год (наблюдение) и куда идёт до 2050 года (прогноз)?

## 2. Главный проверяемый тезис

Люди концентрируются быстрее, чем пустеет территория: доля площади страны с
плотностью ниже порога депопуляции растёт непрерывно, а «плотность вокруг
среднего жителя» (population-weighted density) при этом не падает, а растёт —
и это не сводится к одному региону (Полесье/Чернобыль) или к одной причине
(старение сети дорог).

Допустимые исходы: подтверждение всех трёх утверждений; частичное
подтверждение с явно описанным исключением; опровержение любого из трёх —
публикуется так же полно, как подтверждение (раздел 5 ТЗ). Нарратив под
результат не подгоняется — раздел 11 ТЗ и раздел 8 ниже.

## 3. Три утверждения (замороженный список, дословно из ТЗ раздел 5)

| ID | Утверждение | Основной тест | Что считается опровержением |
|---|---|---|---|
| C-1 | Люди концентрируются быстрее, чем территория пустеет: `population_weighted_density` растёт даже там, где `arithmetic_density` падает | нац. ряд `pop_weighted_density` vs `arithmetic_density`, 1975→2020, знак тренда | `pop_weighted_density` не растёт (плоский тренд ‑ ±5% за весь период, либо падает) на национальном уровне |
| C-2 | `area_share_below(5)` растёт весь ряд 1975→2020 и продолжает расти до 2050 (все сценарии/варианты); рост не объясняется только Полесьем и Чернобылем | нац. ряд `area_share_below(5)`, монотонность по 5-летним точкам; пересчёт с исключением зон (проверка G-4) | ряд не монотонно растёт (есть падение между соседними наблюдаемыми точками, не объяснимое округлением), ИЛИ рост при исключении Полесья/Чернобыля становится статистически неотличим от нуля (проверка G-4 не проходит) |
| C-3 | `network_per_capita` (метров дорог на жителя) выше там, где депопуляция сильнее — «навес сети» существует не только в городах (INF-12), но и вне них | корреляция знака: `network_per_capita_2026` vs `pop_change_1989_2026` по 118 районам (Spearman) | корреляция не отрицательна (Spearman ρ ≥ 0, p ≥ 0.05) либо эффект целиком объясняется городами INF-12 (после исключения городских районов эффект исчезает) |

Для C-1/C-2 «территория» = площадь ячеек сетки внутри границы Беларуси;
«плотность» всегда per км² (одна ячейка = 1 км², арифметика без домножения).
Для C-3 «депопуляция» = изменение официальной численности района 1989→2026
(`web/public/data/data.json`, ближайшие доступные годы к узлам, если 1989
недоступен — ближайший последующий перепис. год).

## 4. Данные (источники заморожены до расчётов)

- **GHS-POP R2023A**, 1 км, Молльвейде (ESRI:54009), эпохи 1975, 1980, 1985,
  1990, 1995, 2000, 2005, 2010, 2015, 2020 (10 узлов, шаг 5 лет). Тайлы
  R3_C20, R3_C21, R4_C20, R4_C21 (те же 4 тайла глобальной решётки JRC, что
  и у INF-12 — тайловая сетка едина для всех продуктов GHSL независимо от
  разрешения, проверено сопоставлением с `data/raw/urban/registry_ghsl.csv`).
  sha256 — в `data/raw/grid/registry_ghsl_pop.csv`.
- **Границы страны/районов** — геометрия проекта (`web/public/data/geo/
  adm1.geojson`, `adm2.geojson`); национальная граница = union полигонов adm1
  (как в `etl/nightlights_fetch.py::_country_geom`).
- **Ряды населения районов и прогноз до 2075** — `web/public/data/data.json`
  (наблюдения) и `web/public/data/forecast.json` (версия `v2026.4`, сценарии
  base/optimistic/negative, узлы каждые 5 лет от 2026 до 2075).
- **Карта дорог** — снимок OSM для INF-04 (`data/raw/access/` или эквивалент,
  уточняется на этапе G-6; если снимок для INF-04 недоступен в нужном
  разрезе — используется тот же Geofabrik-снимок `belarus-latest.osm.pbf`,
  что и у INF-12, с той же датой обращения).
- **Чернобыльские зоны** — `data/curated/chernobyl_zones.csv` (INF-07),
  колонка `class` (1,2 = зона эвакуации/сильно загрязнённые).
- **Ночные огни** — вырезки INF-08 v2 (`data/raw/nightlights/rasters/`),
  сегмент VNL 2012–2020 (один сенсор, тот же принцип, что у INF-12: не
  смешивать DMSP/VIIRS шкалы при проверке G-3).

## 5. Выборка и территориальный охват

- Сетка строится на прямоугольнике-охвате Беларуси в Молльвейде,
  привязанном к пиксельной решётке GHS-POP 1 км (см. раздел 6), с маской
  по факту попадания центра/касания ячейки границы страны (`all_touched`
  при растеризации маски — ячейка на самой границе не теряется).
- Районная агрегация — 118 районов + г. Минск (`r-*` + `BY-HM`), тот же
  реестр, что и в `etl/nightlights_zonal.py`.
- «Полесские районы» для проверки G-4 — операциональный (не строго
  физико-географический) список: все 16 районов Брестской области + 11
  южных районов Гомельской области, прилегающих к бассейну Припяти
  (Брагинский, Ельский, Житковичский, Калинковичский, Лельчицкий, Лоевский,
  Мозырский, Наровлянский, Петриковский, Речицкий, Хойникский) — 27 районов
  суммарно. Список зафиксирован здесь ДО расчёта именно потому, что точная
  физико-географическая граница Полесья не имеет единого общепринятого
  районного перечня (5 физико-географических областей без чёткой
  привязки к текущим границам районов) — это административный proxy,
  ограничение честно указывается в `LIMITATIONS.md` пакета.
- Чернобыльские районы для G-4 — `data/curated/chernobyl_zones.csv`,
  `class ∈ {1,2}` (это отдельный список от Полесья; пересечение возможно и
  не устраняется — районы могут входить в оба списка одновременно, вычитание
  из наблюдаемого ряда идёт по объединению множеств).

## 6. Замороженные параметры

```yaml
grid:
  cell_km: 1.0
  source_crs: "ESRI:54009"        # Молльвейде, нативная равновеликая сетка GHSL
  analysis_crs: "ESRI:54009"      # метрики считаются В РАВНОВЕЛИКОЙ проекции -
                                   # решение зафиксировано в docs/decisions/INF-15.md
                                   # (см. запись D-001): EPSG:3857 из примера
                                   # Приложения А исказил бы площадь ячейки на
                                   # широте Беларуси (~53-56N) на 55-80%.
  clip_bbox_moll: [1602000.0, 5998000.0, 2459000.0, 6512000.0]  # minx,miny,maxx,maxy
  epochs_observed: [1975, 1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020]
depopulation_thresholds:
  primary: 5      # чел/км² - "area_share_below(5)", основной порог ТЗ раздел 4
  secondary: 1    # чел/км² - "area_share_below(1)"
  auxiliary: 25   # чел/км² - вспомогательный порог (Приложение А "метрики")
settlement_components:
  density_threshold: 1     # чел/км² - ячейка "заселена", если плотность >= 1
                            # (совпадает с secondary-порогом депопуляции -
                            # единый смысл "почти никого" в обеих метриках)
  connectivity: 8           # queen's case - сельская застройка типично
                            # диагонально смежна на грубой решётке 1 км
reconciliation:
  raion_tolerance_pct: 3.0   # G-1.1
  national_tolerance_pct: 1.0  # G-1.2
  max_failed_raions_before_drop: 15
  interpolation: linear_between_nearest_official_years  # для узлов эпох, не
                                   # совпадающих с годом переписи/оценки в
                                   # data.json (эпохи 1975/80/85/90/95/2000/
                                   # 2010/2020 не совпадают с рядом data.json
                                   # напрямую - только 2005 и 2015 совпадают)
forecast:
  years_native: [2026, 2031, 2036, 2041, 2046]   # узлы forecast.json как есть
  year_2050: interpolated_linear_between_2046_2051  # 2050 - НЕ нативный узел
                                   # forecast.json (шаг 5 лет от 2026 не
                                   # попадает в 2050); частота упоминания
                                   # "до 2050" в разделах 1-3 ТЗ обязывает
                                   # показать этот год - интерполируем и
                                   # маркируем dtype "f" (не "c"/"e")
  scenarios: [base, optimistic, negative]
  jumpoff: official        # adjusted - см. D-002 в decisions, если понадобится
  variants: [A, B]         # A: продолжение тренда 1975-2020 внутри района
                            # B: пригороды растут быстрее, периферия пустеет
                            #    быстрее (формализация - docs/decisions/INF-15.md)
centroid_track:
  years: [1897, 1913, 1940, 1959, 1970, 1979, 1989, 1999, 2009, 2019, 2026,
          2031, 2036, 2041, 2046, 2050]
  weighting: raion_population_at_centroid   # вес = офиц. численность района,
                                   # применяется к географическому центроиду
                                   # района (не к населённому пункту-центру),
                                   # так как клеточная сетка есть только с 1975
  err_km:
    "1897-1959": 25    # дореволюционные/довоенные - широкий коридор
    "1970-2020": 10
    "2026-2050": 10    # модельная часть, ошибка не сужается
  sensitivity_shift_threshold_km: 15    # G-5
network_per_capita:
  road_classes: [motorway, trunk, primary, secondary, tertiary, residential,
                 unclassified, track]
  osm_reconciliation_tolerance_pct: 15   # G-6
nightlights_crosscheck:
  years: [2012, 2015, 2020]   # пересечение с VNL-сегментом INF-08 v2
  agreement_threshold_pct: 70   # G-3
budgets:
  grid_json_kb: 1536       # ≤ 1.5 МБ
  frames_total_mb: 12
  frame_kb_max: 220
  first_load_mb: 3.5
seed: 42
```

## 7. Что подтверждает / что опровергает (контракт опровержения)

- **Поддерживает C-1:** национальный `pop_weighted_density` строго растёт или
  не убывает (допуск ±2% шума между соседними узлами) на всём ряду 1975→2020,
  одновременно с падением `arithmetic_density` хотя бы на части ряда.
- **Опровергает C-1:** `pop_weighted_density` падает вместе с `arithmetic_
  density` (нет расхождения двух метрик) — тогда сюжет о «концентрации»
  снимается, C-1 публикуется как опровергнутое.
- **Поддерживает C-2:** `area_share_below(5)` монотонно (с точностью до шума
  округления) растёт 1975→2050 (все сценарии) И рост сохраняется (не
  становится статистически неотличим от нуля) после исключения объединения
  «Полесье ∪ Чернобыль» (проверка G-4).
- **Опровергает C-2:** ряд не растёт монотонно ИЛИ рост целиком объясняется
  Полесьем/Чернобылем — тогда C-2 переформулируется как «локальный эффект»,
  не как общестрановой тренд.
- **Поддерживает C-3:** отрицательная и статистически значимая корреляция
  Спирмена между `network_per_capita` и темпом убыли района, устойчивая
  после исключения городских районов INF-12.
- **Опровергает C-3:** корреляция не отрицательна, либо исчезает после
  исключения городов INF-12 — тогда C-3 публикуется как «эффект
  ограничен городами», без обобщения на всю территорию.
- **Альтернативные механизмы, подлежащие проверке до интерпретации:**
  (1) дазиметрическая интерполяция GHS-POP сама по себе стягивает людей к
  застройке → контроль: проверка G-1 (сходимость с офиц. рядом по районам)
  и G-3 (независимый сенсор — огни); (2) граница Беларуси и клип-рамка могут
  срезать пограничные ячейки → буфер рамки ≥5 км с запасом, `all_touched`;
  (3) интерполяция официального ряда к неполным годам (только 2005/2015 —
  точные совпадения) может завышать плавность тренда → все интерполированные
  узлы помечаются dtype и публикуются с этой оговоркой; (4) прогнозная часть
  (вариант A/Б) — сильное допущение о продолжении внутреннего рисунка района,
  не альтернатива наблюдению → маркировка MODEL, диапазон, не точка (раздел 8
  ТЗ, пункт 3).
- **Минимальный вывод при провале главной интерпретации:** карта клеток
  1975–2020 как иллюстрация рисунка расселения (без утверждений C-1/C-2/C-3),
  с честной панелью «что не подтвердилось и почему» — раздел 8 ТЗ и раздел 13
  ТЗ («что делаем, если что-то не получилось») применяются буквально.

## 8. Запрещённые формулировки (редакционный контракт)

Запрещены на странице, в методблоке, в архиве и в титрах видео:
«карта показывает точное число жителей ячейки» (дазиметрическая
интерполяция — не перепись, см. раздел 8 ТЗ п.1); «независимая оценка
численности населения» применительно к сеточным данным; «дорожная сеть
выросла/сократилась» без оговорки «снимок на 2026 год, не история» (раздел
8 ТЗ п.4); денежные/бюджетные формулировки (в этом исследовании денежного
слоя в терминах бюджета нет вообще — только «метры сети на жителя», это не
финансовый показатель, само слово «стоимость» в тексте допустимо только как
метафора обслуживания инфраструктуры, не как денежная сумма); причинные
глаголы без причинного дизайна («миграция вызвала»); утверждение о точности
отдельных ячеек в малозаселённых зонах (раздел 8 ТЗ п.2 — известное
искажение продукта); маркировка модельных клеток (2026+) как наблюдения.

## 9. Публикуемый период

«1975–2020» для наблюдаемого ряда клеток (шаг 5 лет) + «2026–2050» для
модельной части (варианты A/Б × 3 сценария, шаг 5 лет, 2050 —
интерполированный узел) + «1897–2020» для трека центра масс (с расширенным
коридором погрешности до 1959 года) + «дорожная сеть — снимок 2026 года,
без истории».

## Поправка от 2026-07-26 (после этапа 2, до этапа 3)

Сырой GHS-POP не прошёл G-1 (район-уровневая сверка) - см.
`docs/decisions/INF-15.md` D-005 и `docs/notes/grid_validation.md` за
полным разбором и голосованием троих (одобрено с условиями). Применена
constrained dasymetric калибровка: итог по району/стране на каждую эпоху
приравнен к официальному ряду, GHS-POP используется только как
внутрирайонный пространственный вес. Это меняет РЕАЛИЗАЦИЮ, не
утверждения C-1/C-2/C-3 и не пороги раздела 6 (они остаются как были
заморожены) - но дополняет контракт опровержения раздела 7 одним пунктом:

**C-1 публикуется с явной, не только общей (раздел 8 ТЗ п.1), оговоркой**:
обнаруженный при калибровке паттерн (население города-хозяина
систематически переоценено сырым продуктом относительно пригородов) -
это ошибка МЕЖДУ районами, устранённая калибровкой сумм по району; тот же
механизм МОГ БЫ действовать и ВНУТРИ района (между городским ядром и
периферией района) - калибровка сумм по району это не проверяет и не
устраняет. Целевая проверка этого конкретного риска (сверка «ядро vs
периферия» через ночные огни, независимо от GHS-POP) выполняется на этапе
4 как расширение G-3, результат публикуется вместе с C-1 независимо от
исхода.

## Поправка от 2026-07-26 №2 (этап 4, после расчёта G-3)

G-3 не пройдена: согласие знака изменения (население 2012→2020 vs
светимость VIIRS) = 32.8% (порог 70%), доминирующий паттерн - «население
упало по официальным данным, светимость выросла» у 63.9% районов. Это
результат расчёта, полученный ПОСЛЕ заморозки порога 70% (раздел 6) - порог
не менялся и не подбирался под результат. Применяется предписанный этим же
разделом fallback дословно: расхождение сенсоров - главный дополнительный
сюжет исследования, C-1 и C-2 публикуются со статусом «открытый вопрос» с
явной ссылкой на это расхождение, а не «подтверждено». Полный разбор -
`docs/decisions/INF-15.md` D-007.

## 10. Критерий успеха

Хотя бы один из трёх выводов (C-1/C-2/C-3) выдерживает: сверку с
официальными числами районов (G-1) в допуске; независимую проверку огнями
(G-3, ≥70%) — либо, если совпадение ниже порога, расхождение двух сенсоров
честно становится главным сюжетом (раздел 7 ТЗ, проверка 3); устойчивость к
исключению Полесья/Чернобыля (G-4); обязательный контрпример (список
районов вне допуска G-1 публикуется, не скрывается); воспроизведение одной
командой (`make stage11`/`make artifact SLUG=grid`).
