План: обновление сайта (октябрь 2026)

Координатор: dp-coordinator. Рабочая копия ~/deltaplan-site, ветка site/update-oct (от main 3cc039e). В main не вливается — отчёт главной сессии. Журнал — site_update_progress.md.

Цель (задачи пользователя)

  1. Новые скриншоты сайта — графика поменялась (48 крыльев, новые модели), пересняты готовыми инструментами tools/shots.
  2. Модель воздуха на сайте — из «плана» в «сделано»: что умеет, на чём основано (Perdigão, Askervein и др.), границы модели и известные расхождения. Язык — для пилотов, числа — только из репозитория.
  3. Новый раздел «Модели аппаратов» — подстраницы по группам (советские, учебные, мачтовые, безмачтовые), на каждое крыло — рендер модели из Blender (единый ракурс и фон), известные данные с источником и отметкой «паспорт / оценка». Таблицы и страницы — генерирует скрипт из данных репозитория. Ссылка на благодарность DHV.

Правила — .claude/workflow.md, «Общие правила». Hugo собирается без ошибок и предупреждений. Картинки — jpg разумного размера (рендер крыла 40–250 КБ).

Задачи

ЗадачаИсполнительСкоупУсловия приёмки
SU-1 скриншотыdp-mechanictools/shots/gameplay.sh, e2e.sh, itch_shot → C3все файлы C3 на месте, проходит check_contracts.py; кадры без ошибок рендера (крыло в кадре, не чёрные, без интерфейса в itch-кадрах); превью в build/screenshots/site/SU-1/
SU-2 модель воздухаdp-writersite/content/mechanics/air-model.md (+ согласование slope-wind.md, thermals.md, weather.md, строка на главной)страница описывает сделанное, без «план/в работе»; каждое число есть в репозитории (ссылка на документ); разделы «что умеет», «на чём основано», «границы», «известные расхождения»; hugo чистый
SU-3 рендеры крыльевdp-mechanictools/blender/render_wings_site.sh (+ обрезка/сжатие) → C148 рендеров по C1, check_contracts.py — C1 зелёный; лист-контакт в build/screenshots/site/SU-3/
SU-4 генератор страницdp-engineertools/site/gen_wings.py → C2; site/content/wings/**все 48 крыльев, у каждого числа — отметка происхождения и источник; gen_wings.py --check зелёный; hugo чистый; скриншоты страницы крыла и группы в build/screenshots/site/SU-4/
SU-5 тексты раздела и замена картинокdp-writerтексты вне сгенерированных блоков site/content/wings/**/_index.md; главная, mechanics/flight.md и др. — новые кадры C3 и рендеры C1, ссылки на «Модели аппаратов»hugo чистый; скриншоты собранных страниц в build/screenshots/site/SU-5/

Волна 1: SU-1, SU-2, SU-3, SU-4 (параллельно; SU-4 работает против C1 без рендеров — --check до SU-3 красный только по рендерам). Волна 2: SU-5 (после SU-1, SU-3, SU-4).

Контракты (версия 1)

Контрактный тест: uv run -q --with pillow python tools/site/check_contracts.py (из корня копии) — проверяет C1 и C3, для C2 вызывает tools/site/gen_wings.py --check, если генератор уже есть. Менять интерфейс — только через координатора (версия +1, потребители уведомлены).

C1. Рендер крыла (владелец SU-3; потребители SU-4, SU-5) — v1

  • Файл: docs/models/screenshots/glider_<id>/iso45.jpg, где <id> — имя configs/wings/<id>.json (все 48, ни одного лишнего не требуется).
  • Источник: модель assets/models/glider_<id>.glb (экспорт исходника assets/source/glider_<id>.blend — то же, что видит игра), вид iso45 скрипта tools/blender/render_views.py: одинаковые направление камеры, свет и фон (0.80, 0.81, 0.83) для всех.
  • Формат: JPEG, 1280×720, качество 85, sRGB; крыло обрезано по содержимому и отцентровано с полем ≈ 5 % (досыпано цветом фона), масштаб — вписать в кадр (размеры крыла — в таблице, не на картинке).
  • Размер: 40–250 КБ каждый; все 48 вместе — не больше 8 МБ.
  • Нет файла → генератор строит страницу без картинки, --check падает.

C2. Страницы «Модели аппаратов» (владелец SU-4; потребитель SU-5) — v1

  • Генератор: tools/site/gen_wings.py (Python 3, только стандартная библиотека), запуск из корня копии; --check — ничего не пишет, код 1, если сгенерированное расходится с файлами или чего-то не хватает (рендера, обязательного поля).
  • Входные данные (только чтение): configs/wings/*.json (поля и _doc), configs/wing_groups.json (группы и их порядок), locale/ui.csv (названия: ключ name крыла, русский столбец; названия групп), tools/research/data/wing_passports/ (wings_merged.json, out/wings3d_spec.json, wings3d_overrides/, источники), docs/research/wings_config_sources.md, docs/research/glider_3d_tz.md.
  • Файлы:
    • site/content/wings/_index.md — раздел «Модели аппаратов»: сводная таблица всех крыльев по группам;
    • site/content/wings/<group>/_index.md — группа (<group> — id из configs/wing_groups.json, вес = порядок в массиве): таблица крыльев группы;
    • site/content/wings/<group>/<id>.md — страница крыла, адрес /wings/<group>/<id>/; порядок в группе — как в меню игры (reference.best_glide, при равенстве wind_max_ms; scripts/game/wing_catalog.gd) → weight.
  • Владение текстом: страницы крыльев генерируются целиком. В _index.md генератор меняет только блок между строками <!-- gen:begin tools/site/gen_wings.py --> и <!-- gen:end -->; остальное (шапка, вступление, пояснения) — ручной текст (SU-5), генератор его сохраняет; нет файла — создаёт с шапкой по умолчанию и пустым ручным текстом.
  • Страница крыла: название (из locale/ui.csv), прототип и годы, группа, мачтовое/безмачтовое, рендер (C1, путь /docs/models/screenshots/glider_<id>/iso45.jpg), таблица данных: размах, площадь, масса крыла, диапазон пилота, доля двойной обшивки, класс/сертификат DHV (или HGMA), годы, скорости (DHV Vmin/Vmax — если есть; скорости модели игры — трим, полностью на себя — с пометкой «модель игры»), качество модели. У каждого значения — отметка происхождения: паспорт (со ссылкой на источник: карточка DHV, страница/PDF производителя), аналог (паспорт близкой модели — какой), оценка (не из паспорта: подобие от базы, ТЗ, координатор). Числа — как в конфиге (то, что в игре); если паспорт расходится с конфигом — показать оба. Внизу — ссылки на конфиг и раздел ТЗ в репозитории, ссылка на благодарность DHV на главной.
  • Ссылки — только на существующие страницы/файлы (Hugo падает на битых) и внешние адреса источников, найденные в данных репозитория (не выдумывать).

C3. Скриншоты сайта (владелец SU-1; потребитель SU-5) — v1

  • Обновить на месте, те же имена: docs/screenshots/gameplay/{cockpit,chase,free}.jpg (tools/shots/gameplay.sh), docs/screenshots/e2e/<место>_{flight,result}.jpg по всем configs/locations/*.json (tools/shots/e2e.sh пишет png → перевести в jpg q85, png не коммитить).
  • Новые: docs/screenshots/site/NN_<русское_имя>.jpg — JPEG q85, 1600×900, ≤ 350 КБ каждый; список — в задании SU-1 и в docs/screenshots/site/README.md (команда съёмки на каждый кадр).
  • Godot — только с XDG_DATA_HOME=$(mktemp -d).

Решения пользователя (не обсуждаются)

  • Задание главной сессии 2026-10-01: три задачи выше; в main не вливать; исполнители — Sonnet для текстов, Haiku для съёмки по готовому скрипту, Opus для сложного.