Контракты
Где живут схемы и у кого из них есть schemaVersion.
Схемы описываются один раз, в packages/contracts, на Zod. Модели Python собираются из них. Сгенерированные файлы вручную не правят: сборка сравнивает их с исходными схемами и падает на расхождении.
Запрос и ответ на границе TypeScript и Python проходят те же схемы. Имена на странице схем — те же, что проверяют данные в коде.
Ограничение
Поля schemaVersion нет у каждой Zod-схемы. Оно есть у контрактов, которые пересекают границу
пайплайна. Тест packages/contracts/src/index.spec.ts явно оставляет без него HealthCheck,
RunConfig и AgentConfig. Схемы чата в packages/contracts/src/chat.ts в этот реестр не входят
и schemaVersion не объявляют. У агента есть semver-поле version, это не schemaVersion.
Несовместимое изменение версионированного контракта поднимает schemaVersion: старый пример перестаёт проходить проверку, пока новая версия не описана явно.