Версия движка и заметки о выпусках
Корневой VERSION задаёт идентификатор движка. Эта политика CalVer с календарным годом, ADR-0002 и процедура изменения контрактов обязательны для каждого обновления master. Перед обновлением игры прочитайте историю изменений.
Навигация, маршруты и данные для ИИ ссылаются на VERSION, не копируя значение. Шаблон Jekyll включает корневой файл напрямую при сборке.
Нотация
Поля YEAR.MAJOR.MINOR.PATCH: YEAR — четырёхзначный год UTC; MAJOR — положительный номер линии в этом году с 1, не месяц или обещание SemVer. MINOR считает обновления master внутри линии; PATCH — только релизной ветки. Ведущих нулей нет; minor/patch начинаются с 0.
| Контекст | Идентификатор | Значение |
|---|---|---|
| master | 2026.1.21-dev |
Изменение master 21 в первой линии 2026 года; patch отсутствует |
| первый срез | 2026.1.21.0-rc |
Срез для стабилизации с этой точной версии master |
| патч стабилизации | 2026.1.21.1-rc |
Первый патч фиксированного среза |
| релиз | 2026.1.21.1 |
Выпуск проверенного кандидата; снимается только суффикс |
| патч релиза | 2026.1.21.2 |
Следующий патч того же среза |
| следующая линия master | 2026.2.0-dev, 2026.2.1-dev, 2026.2.2-dev |
Независимая разработка после первого среза |
VERSION содержит ровно один идентификатор и необязательный перевод строки. В master всегда три числовых поля и -dev; в релизной ветке — четыре поля и либо -rc, либо отсутствие суффикса. Нумерованных rc, alpha, beta, времени сборки и Git-суффиксов нет. Неизменяемые Git-теги имеют вид v<version>.
Календарный месяц записывается в дате изменения/выпуска по UTC, а не в MAJOR. При подготовке обновления master выставляйте актуальный год UTC. Первое обновление нового года начинает YEAR.1.0-dev; иначе minor увеличивается ровно на один. После одобренного владельцем среза увеличьте major на один и сбросьте minor в ноль. Год, major и minor среза релизной ветки не меняются: патч, выпущенный в следующем календарном году, сохраняет идентификатор среза.
Каждое обновление master
Каждый коммит первого родителя master получает новый minor и датированные двуязычные заметки: merge, документация, тесты, CI, зависимости и отмены тоже. Перед интеграцией согласуйте исправления рабочей ветки с последним master; прямой push нескольких коммитов должен соблюдать правило на каждом шаге. Незалитые коммиты переносите rebase на полученный tip; merge нужен только для разошедшихся опубликованных историй. Перед публикацией пересчитайте версию и сохраните опубликованные предки.
- Запишите точные исходную и целевую ревизии, проверьте весь диапазон исходников/тестов/документации и перечислите затронутые поверхности и инварианты смысла существующих значений.
- Сохраните смысл всех существующих допустимых входов. Добавление/расширение сохраняет старые случаи; замена получает отдельное имя, тип, ключ или явную границу формата, а прежний API удаляется. Для затронутого старого использования обеспечьте ошибки компиляции/перепекания/валидации. Следуйте ADR-0002; метка совместимости не отменяет правило.
- Увеличьте
VERSIONотносительно текущего master. Первое принятие политики заменяет историческую2022.1.0.wipна2026.1.1-dev; это не восстановленная история релизов. - Замените заголовок предыдущей записи
## Current - <дата>её прежним идентификатором изVERSION, затем добавьте## Current - <дата UTC>в оба чейнджлога. Валидатор берёт изVERSIONномер только этой новой записи; исторические заголовки сохраняют точные идентификаторы. Дата заметки master — дата коммита по UTC. Каждая запись содержит непустой раздел### Migration/### Миграция; явно пишите, если миграция проекта не нужна, и почему.Unreleased— место для черновика, а не замена датированной записи опубликованного шага. Сохраняйте предыдущие записи, чтобы пропущенные версии мигрировались последовательно. - Для каждого удаления/замены заполните исчерпывающую запись миграции ниже и привяжите обязательное решение генерируемого контракта к точным исходному/целевому хешам. Проверяйте семантику даже при пустом статическом diff.
- В том же изменении обновите ответственные руководства, примеры, оба языка и маршрутизацию
AGENTS.md. Через владельцев перегенерируйте затронутые модели/справочники, диаграммы/скриншоты, сниппеты, состояние переводов, сайт/поиск/маршруты, оценку ИИ и данные для ИИ в порядке зависимостей. Полный маршрут задаёт ведение документации. - Выполните затронутые проверки native/скриптов/конфигурации/контента/пакетов, отрицательные тесты старого использования и положительные тесты неизменённого/нового использования. Проверьте версии/чейнджлоги и всю необходимую документацию/сайт. Запишите точные результаты, решения по совместимости/ABI/ресурсам и ограничения; номер версии сам по себе не меняет совместимость выполнения.
- Перед разрешённым коммитом/публикацией выполните валидатор обновления относительно фактической исходной ревизии. CI проверяет каждый входящий шаг master, а не только конечный номер. Публикуйте только по разрешению владельца и сохраняйте опубликованный tip предком.
python BuildTools/docs_engine_version.py --check --branch master --baseline-git-ref HEAD
python BuildTools/tests/test_engine_version.py
Для проверки диапазона уже оформленных коммитов:
python BuildTools/docs_engine_version.py --check --branch master --baseline-git-ref <previous-master-sha> --target-git-ref <new-master-sha> --history
Проверке исходников --check Git не нужен. Сравнение требует точных доступных исходной и целевой ревизий; отсутствие или неполную базу обходить нельзя. PR сравнивает итоговый head с базой, push проверяет каждый входящий шаг первого родителя. Для ревизий до политики всё равно нужен аудит полного диапазона исходников.
Исчерпывающая запись миграции
Для каждого удалённого/заменённого контракта отдельно выполните все требования ниже: точные символы, файлы, поиски, порядок, значения и результаты. Агент не должен угадывать замену или продуктовое решение.
- Точная вводящая версия и диапазон старых/новых ревизий; все затронутые бэкенды, роли, платформы, перегрузки, настройки, поля, форматы контента и сохранённые свойства.
- Старое имя/сигнатура/ключ/значение и первоначальный смысл; новая декларация и смысл; причина удаления. Перечислите сохранённые инварианты: единицы, числовые ID, специальные значения, значения по умолчанию, порядок, владение и побочные эффекты.
- Команды/шаблоны обнаружения и точная диагностика компилятора/анализатора/пекаря/валидатора, включая динамически объявленные ссылки конфигурации/контента. Укажите способ доказать, что проект не использует затронутую поверхность.
- Полные примеры до/после и однозначные преобразования: импорты/колбэки, все затронутые скриптовые бэкенды, native-расширения, конфигурация и авторский контент. Явно разрешите перегрузки и крайние случаи; при отсутствии замены укажите судьбу удалённой возможности.
- Упорядоченные шаги регенерации, конфигурации, компиляции, перепекания, сброса кеша и упаковки для всех сторон/ролей. Ссылайтесь на поддерживаемых исполняемых владельцев, а не инструменты частной игры.
- Преобразование сохранённых данных, точные операции
MigrationRule, где применимо, резервная копия/изолированное восстановление, значения по умолчанию/отсутствующие/старые значения, идемпотентность и граница отката. Явно пишите, если миграция данных не нужна. - Последствия для маркера сетевой совместимости, ABI/обновлятора/схем ресурсов, запреты смешанных версий, порядок развёртывания и откат. Явно перечислите неизменяемые идентификаторы.
- Проверки приёмки: затронутое старое использование завершается ошибкой до игрового процесса, незатронутое сохраняет результаты, мигрированное/новое проходит, необходимые пути сохранения/восстановления/бэкендов выполнены. Запишите точные свидетельства завершения и решения владельца, ещё блокирующие обновление.
Английские и русские инструкции должны совпадать по смыслу. При пропуске нескольких обновлений выполняйте записи от старых к новым с учётом промежуточных границ данных и перепекания. Git diff, ссылка на реестр или «обновите вызовы» не заменяют конкретную инструкцию миграции.
Актуальный API и миграции БД
Engine поддерживает только актуальный API выбранной ревизии. Нет старых алиасов API, разрешающего разбора прежних ключей, запасной семантики и общих режимов старого выполнения. Существующие значения сохраняют первоначальный смысл; удалённый ID перечисления/свойства нельзя переиспользовать для переинтерпретации сохранённых значений. Исправление документированного дефекта восстанавливает смысл и сопровождается проверкой инварианта; намеренная смена допустимого старого случая является заменой.
Существующая обработка MigrationRule — узкое исключение для преобразования сохранённых сущностей/свойств. Она не сохраняет старый API вызовов/конфигурации/контента и не разрешает общую миграцию бизнес-данных БД. Опишите точное старое/новое сохранённое свойство или ссылку и докажите преобразование на изолированных данных; продуктовые бизнес-преобразования остаются у проекта. Центральный маркер MigrationRule Version — отдельный вход хеша совместимости, а не счётчик публичной версии. Необходимые отказы старому бинарнику помечаются существующим маркером временной совместимости; этот маркер не разрешает шим старого API.
Обновление без миграции проекта либо сохраняет все используемые контракты, либо явно завершается ошибкой компиляции/перепекания/валидации затронутого использования. Переинтерпретация смысла при прежней форме, тихое приведение, подстановка значения по умолчанию и ошибка только после начала обычного игрового процесса недопустимы. Если компилятор не различает старое использование, введите отдельный идентификатор/тип/формат и валидатор во владении исходников.
Срез, стабилизация и патчи
- Владелец выбирает и фиксирует точный проверенный SHA/версию master, матрицу платформ и полномочия стабилизации/патчей. Сделайте срез
release/YEAR.MAJORна этом SHA и задайтеYEAR.MAJOR.MINOR.0-rc; запишите фиксированный срез и совокупные миграции на обоих языках. Создание ветки/тега и публикация требуют команды владельца. - Независимо начните следующий major master с minor ноль. Исправления релизной ветки сохраняют год/major/minor среза и увеличивают patch один раз на изменение первого родителя, сохраняя
-rcпри стабилизации. Документируйте и проверяйте каждый патч столь же полно, как изменения master. - Выпустите проверенного кандидата снятием
-rc, сохранив patch. В этом переходе разрешены толькоVERSIONи документация/данные документации; изменение кода/сборки/тестов требует следующего патча стабилизации и повторной квалификации. - Дальнейшие исправления релиза увеличивают patch без суффикса. Переносите только одобренные исправления с тестами, миграциями и документацией фактического поведения ветки; не вливайте целиком поздние добавления API master в фиксированный срез. Если исправлению нужна новая несовместимая семантика, задайте отдельный контракт и явную миграцию вместо смены смысла существующих значений.
- Выполните
docs_engine_version.py --check --branch release/YEAR.MAJORотносительно фактической исходной ревизии и полную матрицу квалификации. Публикуйте неизменяемые тегиv<version>и заметки GitHub только после прямого разрешения. Явно ведите происхождение релиза и политику поддержки/переноса патчей; эта будущая процедура не утверждает, что релизные ветки и исторические снимки сайта уже существуют.
Идентификаторы и потребители
| Идентификатор | Значение |
|---|---|
FO_ENGINE_VERSION |
Engine VERSION, проверенный общим парсером |
FO_ENGINE_REVISION |
SHA Engine, отслеживаемое состояние -dirty или unknown для архива исходников |
FO_BUILD_HASH |
Ревизия игрового проекта для пакетов/обновлятора |
Common.GameVersion |
Версия игры во владении проекта |
FO_COMPATIBILITY_VERSION |
Хеш контрактов выполнения с отдельным ручным маркером миграции |
| Версии ABI/схем ресурсов | Их контракты сериализации/протоколов во владении исходников |
BuildTools/engine_version.py обслуживает CMake, native-генератор и документацию. VERSION/Git-ссылки Engine инвалидируют метаданные. Запуск идентифицирует Engine отдельно от игры; вложенный архив не наследует Git-идентификатор родителя. Навигация/маршруты сайта и данные ИИ используют ту же версию; её ссылка открывает чейнджлог выбранного языка. Документация обновляется на current/master; снимками владеет ADR-0006. Исторические Since сохраняются. Брендинг, версии Android/установщиков и хеши пакетов принадлежат проекту.
Владение исходными данными
VERSION,BuildTools/engine_version.py,BuildTools/docs_engine_version.py,BuildTools/tests/test_engine_version.pyBuildTools/cmake/helpers/EngineVersion.cmake,BuildTools/cmake/stages/Codegen.cmake,BuildTools/codegen.py,Source/Frontend/ApplicationInit.cpp.github/workflows/validate.yml,AGENTS.md,Docs/documentation-manifest.json,BuildTools/docs_site.py,BuildTools/docs_ai_delivery.py
CMake использует файловые Git-зависимости; CONFIGURE_DEPENDS обнаруживает packed-to-loose refs, проверенные в test_engine_version.py.