Версионирование API и capability checks
✅ Source + repository policy verified ⚠️ Version drift documented
Political World версионирует core mod и Public API независимо.
Для addon ecosystem это принципиально.
Version policy
Заголовок раздела «Version policy»API_VERSIONING.md задаёт политику API 1.x:
major → breaking public contractminor → backward-compatible public additionspatch → fixes без намеренного breaking documented public contractНо “current candidate” в этом файле устарел относительно проверенного source. Поэтому используем его как policy, а не как источник текущего номера API.
В проверенном исходнике:
ApiMajor = 1ApiMinor = 9ApiVersion = "1.9.0"Запрашивайте минимально нужный API
Заголовок раздела «Запрашивайте минимально нужный API»Метод:
PoliticalWorldAPI.IsCompatible(requiredMajor, requiredMinor)Проверенная логика:
required major должен совпасть с current majorcurrent minor должен быть >= required minorПоэтому addon, использующий только API 1.6 features, правильно пишет:
if (!PoliticalWorldAPI.IsCompatible(1, 6)) return;даже если установлен API 1.9.
Аргумент — minimum requirement, а не номер установленного API.
Не требуйте latest без причины
Заголовок раздела «Не требуйте latest без причины»Если addon реально использует только контракт 1.6:
IsCompatible(1, 9)искусственно отрежет пользователей API 1.6–1.8.
Выбирайте первый minor, в котором появился необходимый public contract.
Optional features: capabilities
Заголовок раздела «Optional features: capabilities»Для optional/newer functionality лучше:
PoliticalWorldAPI.HasCapability("political-event.rare")а не только сравнение version numbers.
Есть также:
PoliticalWorldAPI.GetCapabilities()Зачем capabilities
Заголовок раздела «Зачем capabilities»Version отвечает:
«Какое поколение API?»
Capability:
«Умеет ли этот runtime именно то, что мне нужно?»
Для addon code второй вопрос часто важнее.
Например:
if (PoliticalWorldAPI.HasCapability("event.subscribe")){ // включаем event-driven integration}else{ // отключаем только optional feature}Стоимость lookup
Заголовок раздела «Стоимость lookup»В проверенном source capability check использует лениво создаваемый HashSet<string> с ordinal comparison.
Повторный HasCapability(...) — практически O(1), а не постоянный scan массива.
Подтверждённые source capabilities
Заголовок раздела «Подтверждённые source capabilities»В source есть, среди прочего:
addon.registryaction.registryideology.readideology.registergovernment.readgovernment.registerkingdom.readkingdom.writekingdom.addon-datakingdom.addon-data.typedlocalization.safelocalization.fallbacklocalization.registercontent.batch-registerparty.readparty.writeevent.publishevent.subscribeevent.core-hookspolitical-event.rarediagnosticsvalidationЕсли важна exact availability — вызывайте GetCapabilities() в runtime.
Deprecation policy
Заголовок раздела «Deprecation policy»Repository policy рекомендует перед удалением public 1.x member:
1. добавить replacement2. отметить/document old member как deprecated3. по возможности оставить migration window4. удалить только в следующем breaking major API, если нет серьёзной correctness/safety причиныТак framework развивается без требования обновить все addons в один день.
Internals не покрыты контрактом
Заголовок раздела «Internals не покрыты контрактом»Compatibility guarantee относится к Public API.
Он не обещает стабильность:
MainScenarioBridgeprivate methodsinternal classesfolder layoutAddon, который зависит от internals, сам выходит за пределы public versioning contract.
Общее правило
Заголовок раздела «Общее правило»Два инструмента для двух задач:
IsCompatible → minimum contractHasCapability → optional featureНе заменяйте один другим.