# Беларусь из космоса, 1992–2075: проверяемый пакет (INF-08, v2.0.0)

Пакет воспроизводит все числа исследования
«[Беларусь из космоса](https://by-population-maps.vercel.app/research/nightlights)»:
гармонизированный ряд ночной светимости 118 районов и Минска за 33 года
(DMSP 1992–2011 + VIIRS 2012–2024), индекс расхождения «свет против
официального населения» и модельную иллюстрацию будущего 2030–2075 по
трём сценариям прогноза населения проекта (v2026.4). Кадры таймлапса и
рилс генерируются из этих же данных вендоренным скриптом.

## Воспроизведение одной командой

```bash
bash code/run.sh
```

Требования: Python ≥ 3.10, только стандартная библиотека (~10 с).
Конвейер стартует с вендоренных зональных сумм (`zonal_dmsp.csv`,
`zonal_vnl.csv`, `zonal_simviirs.csv`, `floor_2024.csv`): гармонизация
«мостом» (валидационный отчёт с гейтами) → оценка эластичностей →
модель 2030–2075 → `nightlights_v2.json` → инварианты → сверка с
`checks/expected_results.json`.

## Данные

**Ретро 1992–2011**: DMSP-OLS stable lights в межспутниковой калибровке
Li et al. (Figshare, CC BY 4.0), DN 0–63, ~1 км. **Современность
2012–2024**: EOG VIIRS VNL v2.1 «average» (зеркало OpenGeoHub/Zenodo,
CC BY 4.0), 500 м. Глобальные растры (~2 ГБ) не вендорятся — URL и
sha256 в `sources/registry.csv`; вендорятся вырезки по Беларуси
(35 GeoTIFF, пиксели вне страны обнулены, факелы двух НПЗ замаскированы).
Стык сегментов — схема «мост» без подгонки на стыке: R² 0,92 (гейт
≥ 0,9), разрыв −3,0 % (гейт ±5 %), все числа и чувствительность — в
`docs/notes/nightlights_v2_validation.md`. Ряд VNL кросс-проверен против
независимой обработки WorldPop fvf (R² ln-долей 0,93–0,98).

## Главные результаты

- **33 года наблюдений**: страна тускнеет в 1990-е, с 2000-х разгорается
  Минская агломерация; самый быстрый рост света 1992→2024 — Островецкий
  район (БелАЭС).
- **Сюжет v1 воспроизводится на независимом источнике**: расхождение
  «свет отстаёт от населения» сосредоточено в индустриальных районах
  (Смолевичский/Жодино: доля света ×0,63 от тренда при населении ×0,99;
  Солигорский ×0,63); Минск вровень (индекс ≈ +0,07).
- **Модель 2030–2075** (не прогноз света!): при следовании света за
  населением агломерация держится, периферия тускнеет; разрыв сценариев
  к 2075 — 433К…550К радианс-единиц (−13 %…+10 % к базовому). Любой
  модельный кадр несёт впечатанный маркер «МОДЕЛЬ».

## Структура пакета

- `data/raw/nightlights/rasters/` — 35 вырезок растров (сырьё);
  `zonal_*.csv`, `floor_2024.csv` — зональные суммы; реестр —
  `sources/registry.csv`;
- `etl/nightlights_harmonize.py` — гармонизация (stdlib);
  `etl/nightlights_model.py` — эластичности и модель будущего;
  `etl/nightlights_v2.py` — финальный набор; `etl/nightlights.py` —
  v1-индекс (библиотечно);
- `etl/nightlights_fetch.py`, `etl/nightlights_zonal.py`,
  `etl/nightlights_frames.py` — растровые шаги (rasterio, в run.sh не
  вызываются); `tools/render_reel_space.py` + `tools/reel_space_scene.json`
  — рилс-конвейер (кадры детерминированы, сид фиксирован);
- `params/assumptions.json` (+ YAML-зеркало) — ВСЕ параметры: пороги,
  дефакеляция, окна стыка, β по классам, floor, классификация районов;
- `web/public/data/nightlights_v2.json` — итог лендинга; `checks/` —
  инварианты и контрольные метрики.

Методика, ограничения, происхождение данных, задания для агентов —
LIMITATIONS.md, PROVENANCE.md, AGENT.md (3 обязательных задания).
