# Тестовые данные и ожидаемые результаты

Все наборы синтетические. Генератор `scripts/test-data.js` использует фиксированное зерно 712026.

| Файл | Назначение |
| --- | --- |
| demo-project.json | Полный проект: 6 зон, июнь 2026, 4 канала и 144 строки истории |
| api-contract.json | Такой же проект как пример ответа будущего API |
| zones.csv / zones.xlsx | 6 зон; импорт через тип «Зоны» |
| invalid-zones.csv | Завышенный рис, пустой погодный индекс, повторяющийся ID; импорт должен быть отклонён целиком |
| periods.csv | 6 месячных записей; фактическая подача и ожидаемый остаток |
| channels.csv | 4 направления, включая двухзвенный путь F → D → A |
| history.csv / history.xlsx | 24 зоны × 6 сезонов, 2020–2025; числовые цели синтетические |
| detailed-crops.json | Полный проект с рисом, пшеницей и люцерной в зоне A; разные фазы, почвы и технологии |

## Сезонный баланс

1. Импортировать `demo-project.json` как полный проект, применить.
2. При нулевых ползунках: 118 000 га, 70 000 га риса, 14 200 га технологий, 3,25 млрд м³ воды, сезонного дефицита нет.
3. При воде −15%: дефицит 167,6 млн м³, высокий риск в A и B.
4. Водосбережение +20 п.п. при воде −15%: дефицит 112,4 млн м³, высокорисковых зон нет, но дефицит A и B остаётся.

## Импорт и редактор

- Загрузить `invalid-zones.csv`: увидеть ошибки; кнопка применения недоступна, прежний набор не меняется.
- Создать зону с уникальным ID, увеличить число зон до 7; сохранить, обновить страницу — зона должна сохраниться после статуса «Сохранено».
- Изменить одну зону: другие исходные записи должны остаться прежними.
- Загрузить `detailed-crops.json`: зона A содержит 3 культуры, их площади дают 24 000 га; рис 19 000 га, технологии 1 800 га. Проверить разные коэффициенты в редакторе.

## Периоды и сеть

Для `demo-project.json`, нулевых ползунков и июня 2026:

- Потребность 470 млн м³; получено 285 млн м³; ожидается 190 млн м³.
- Зональные дефициты: A 25 млн, B 20 млн; сумма 45 млн м³. Резервы: E 20 млн, F 30 млн.
- При перераспределении должны появиться допустимые передачи с потерями. Для заданной эвристики: дефицит после предложения 7,75 млн м³, потери около 3,80 млн м³.
- Реально получено сверх расчётной потребности в F: 5 млн м³. Это индикатор проверки, не установленная неэффективность.
- При снижении воды фактически полученные объёмы должны остаться прежними; меняется только ожидаемый остаток.

## ML

- Нажать «Обучить и проверить»: обучение 2020–2023 (96 строк), калибровка 2024 (24 строки), независимая проверка 2025 (24 строки).
- Проверить конечные MAE/RMSE/R², упорядоченные неотрицательные интервалы и частоту дефицита от 0% до 100%.
- Видна отметка о синтетическом происхождении; метрики не представляются как реальная прогнозная точность.
- История только одного сезона или с недостаточным числом строк должна быть отклонена при обучении.

## Хранение и источники

- Изменить ползунок, дождаться «Сохранено», обновить страницу: настройка должна восстановиться.
- Сохранить именованный сценарий, изменить данные, открыть сохранённый: восстанавливается весь набор, графики, каналы и история.
- Экспортировать JSON и импортировать обратно: настройки и исходные данные воспроизводятся.
- Для зоны A задана учебная точка 44,85 / 65,5, а не координаты реального канала. Запросить Open-Meteo: показывается настоящий текущий модельный прогноз для этой точки и дата запроса. Числа зависят от времени; сезонный индекс не меняется.
- Неверный JSON API или сетевой сбой не должны заменять рабочий набор.

Автоматические проверки запускаются командой `npm test`.
