# Тематические модули и параллельная разработка

28.10.2026. Рефакторинг опубликован на основном сайте: **v0.7.0 / 754b604c1ee4980e, 03:07 МСК**. Полный MVP остаётся в работе.

## Исходники и сборка

Редактируемый код находится в `src/`, а `dist/` генерируется. Версии импортов JS/CSS и подпись выпуска подставляются в сборку; исходники при сборке и публикации не переписываются. `scripts/build-game.py` проверяет, что исходники не менялись во время сборки, сохраняет ресурсы, данные, research, upload и notes и удаляет только свои устаревшие результаты.

Главное руководство для исполнителей — `PARALLEL-DEVELOPMENT.md` в корне проекта. Есть `src/README.md` и инструкции областей `src/ui/AGENTS.md`, `src/runtime/AGENTS.md`, `src/engine/AGENTS.md`. Карта модулей также сохранена в `reference-original/module-ownership.json`.

## Области

| Область | Владеющий модуль |
| --- | --- |
| Запуск, общий вход команд, сборка зависимостей | `src/app.mjs` |
| Город, жители, производство, губернатор | `src/ui/city.mjs`, `city.css` |
| Наука и правительства | `src/ui/science.mjs`, `government.mjs`, `science.css` |
| Карта и камера | `src/ui/map-view.mjs`, `map.css` |
| Выбор и маршруты | `src/ui/map-controls.mjs` |
| Приказы и работы юнитов | `src/ui/unit-orders.mjs`, `unit-orders.css` |
| Отношения и обязательные решения | `src/ui/relations.mjs`, `decisions.mjs` |
| Новая партия, загрузка, редактор | `src/ui/session.mjs` |
| HUD и сообщения | `src/ui/hud.mjs`, `feedback.mjs`, `shell.css` |
| ИИ и измерения хода | `src/runtime/ai-turn.mjs` |
| Анимация и показ событий | `src/runtime/presentation.mjs` |
| Изображения, звук и кеши | `src/runtime/resources.mjs` |
| Подключение модулей и проверки зависимостей | `src/runtime/context.mjs` |
| Проверка и исполнение команд | `src/engine/command-validation.mjs`, `command-application.mjs` |
| Формат и миграция сохранений | `src/engine/game-schema.mjs`, `savegame.mjs` |

Существующие торговля, дипломатия, редакторы, правила и медиа остаются в своих тематических файлах. Главные бывшие монолиты сократились: app.mjs с 1250 до примерно 157 строк, engine/game.mjs с 836 до примерно 119. Всего перенесено 105 собираемых файлов: 97 JS, 7 CSS и шаблон HTML.

## Контракты

У 14 фабрик интерфейса и исполнения собственное состояние экземпляра и явный `requiredPorts`. Недостающая зависимость или повторное объявление порта обнаруживаются при запуске. Модули не импортируют входной app.mjs; события экрана находятся вместе с его функциями. Это позволяет назначать исполнителей по тематическим файлам.

Общие точки остаются явными: новый тип команды согласованно подключается к проверке/исполнению, новый формат — к миграции, новый экран — к сборке зависимостей. За них отвечает интегратор. В общей рабочей копии нельзя пересобирать dist во время браузерного теста другого исполнителя; для самостоятельных прогонов нужны отдельные рабочие копии.

## Проверки и публикация

- 656 JavaScript-проверок пройдены; DOM-сценарий сохранил запуск, науку, производство, движение, ИИ, захват, победу и продолжение сохранения.
- Три проверки сборки подтвердили повторяемость, версии вложенного JS/CSS, отсутствие изменений исходников, безопасную очистку и сохранность посторонних данных.
- Независимое сравнение с исходным опубликованным ядром v0.6.0 дошло до победы за 276 команд на 42-м ходу: команды, результаты, события, весь мир и PRNG совпали, сохранение/загрузка вставлялись после каждой команды. [Отчёт](data/module-refactor-engine-comparison.json).
- Вычисленные стили главного экрана, города, науки и торговли совпали с прежним CSS; проверены также ширины 1024 и 600. [Отчёт браузера](data/browser-module-refactor-verification.json).

При проверке переноса исправлены пути фоновых изображений в CSS-переменных. Часть последующих браузерных прогонов попала на высокую общую нагрузку сервера и таймауты загрузки обычных PNG. Прогоны остановлены, затем после снижения нагрузки контрольная опубликованная v0.6.0 загрузилась за 471 мс. Последовательный повтор новой сборки прошёл; локальная загрузка заняла 383 мс. Это отдельный контрольный замер, а не гарантия времени на любом устройстве.

На основном сайте прошли восемь сценариев: сравнение стилей, генератор мира, управление, город, технологии, торговля, автоматические приказы и полная партия. Полная партия завершилась на 18-м ходу после 53 команд человека; импорт и перезагрузка результата совпали точно. Генератор проверен также на 12 800 клетках, 16 цивилизациях и старых сохранениях. Все восемь отчётов имеют текущий хеш, основной URL и пустые списки ошибок страницы/запросов. При сверке найден устаревший шаг браузерного драйвера: после клика по пустой клетке перед движением клавиатурой теперь явно выбирается юнит; проверки состояния остались строгими. Исправленный сценарий повторён успешно.

Сверены 108 опубликованных файлов; все 109 исходных файлов остались побайтово неизменными после сборки и публикации. Ссылки загрузки изображений и общих заметок сохранены. Независимые служебные страницы исключены из вычисления версии игрового кода.

## Сохранённая незаконченная работа

Черновик загрязнения не входит в этот рефакторинг: он сохранён отдельным патчем и файлами в `reference-original/pollution-candidate-20261028/`. Новая механика должна быть перенесена в тематические исходники и полностью проверена перед отдельной публикацией; старые снимки нельзя накладывать поверх нового app.mjs целиком.

## Уточнение изоляции служебных страниц, v0.8.0

Обнаружена и исправлена ошибка разбиения: случайная старая копия notes/app.mjs могла перезаписать более новую независимую сборку заметок. Актуальные четыре статических файла восстановлены штатной сборкой services/shared-notes без перезапуска сервиса или изменения документа. Игровая сборка теперь игнорирует служебные каталоги даже при ошибочной копии в src/, игровой публикатор вообще не размещает notes/upload. Эти страницы собираются и публикуются своими командами. Добавлена четвёртая проверка сборки с воспроизведением конфликта старого исходника и свежего результата; все четыре проверки прошли. Повторная настоящая игровая публикация сохранила текущие файлы заметок и игровой хеш. После удаления случайного исходника в src/109 файлов, собираемых игровых105. [Браузерная проверка](data/browser-independent-services-isolation.json).
