ADR-0012: Contract-first между репозиториями
- Status: accepted
- Date: 2026-09-01
Контекст
OpenAPI хранится в отдельном репозитории, но ручные HTTP DTO в сервисе уже расходились с ним по имени
requestKey. В polyrepo нельзя подключить исходники соседней папки или общую multi-service сборку.
Решение
portable-agent/contracts является единственным местом, где контракт редактируют вручную.
- Все спецификации имеют одну SemVer-версию.
- Pull request проверяется Redocly, тестами схем и
oasdiff. - Тег
vX.Y.Zсоздаёт GitHub Release с bundle спецификаций, SHA-256 и artifact attestation. - Сервис хранит закреплённый снимок release, чтобы сборка работала без сети.
- OpenAPI Generator создаёт HTTP models и API interface только в
build/. - Controller переводит generated models в команды service-слоя.
- Domain, service и repository не зависят от generated-кода.
- Обновление версии контракта выполняется отдельным pull request.
Generated-код не коммитится. Доменные классы не публикуются в общей библиотеке.
Причина
Так контракт остаётся источником истины, но сервисы можно собирать независимо. Версия release делает обновление явным, а локальный снимок убирает сетевую зависимость из обычной сборки.
Последствия
- Ручные HTTP DTO удаляются после подключения генератора.
- Breaking change требует новой major-версии, migration guide и явного approval maintainer-а.
- Снимок спецификации дублирует файл физически, но его нельзя редактировать; источник и версия записаны рядом с ним.
- Клиенты Java, Python и TypeScript генерируются только когда появляется реальный потребитель.
- Git submodule и общий source-код между сервисами не используются.