Когда вы начинаете новый проект с чистого листа, программирование с ИИ кажется настоящей магией. Вы вводите промпт, и модель без колебаний генерирует чистый компонент или работающий бэкенд-эндпоинт.
Но по мере роста кодовой базы наступает трезвое отрезвление.
Примерно на 100 000 строк кода обычный ИИ начинает заметно выдыхаться. Он пытается угадывать, ищет по репозиторию вслепую и галлюцинирует несуществующие функции. Примерно на 300 000 строк самостоятельное суждение модели практически рушится: контекстного окна не хватает, классический grep по всему проекту сжигает тысячи токенов, а разработка превращается в бесконечный круг исправлений сломанного кода.
Именно здесь бразды правления берут на себя системные контракты.
Что такое контракт в AITM?
Контракт - это не обычный комментарий в коде и не строка в забытом README.md, которая перестаёт быть правдой через два спринта.
Это машинно запрашиваемое поведение системы.
Он точно описывает, что должна делать конкретная часть приложения, и ссылается на точные исходные файлы, тесты и элементы интерфейса. Вместо того чтобы блуждать и перечитывать десятки файлов, агент задаёт системе прямой вопрос: "Где и как реализовано это поведение?" и мгновенно получает точный ответ.
Каждый контракт в AITM опирается на три ключевых столпа:
- behavior: Однострочная суть того, что делает код. Самое важное поле из всех. Агент сопоставляет это правило с реальной реализацией в файле. Если возникает противоречие, система сразу понимает, что это либо баг, либо устаревший контракт.
- confidence: Метрика достоверности информации. Показывает, насколько надёжно описание по сравнению с остальными данными в системе (например, проверено ли поведение реальными тестами).
- variables: Связь с общим языком коммуникации системы (например,
BL.PIPELINE). Работает как мост между бизнес-логикой на фронтенде и бэкенде, так что контракты можно мгновенно фильтровать по конкретной части интерфейса или слоя данных.
Реальный пример из продакшена
В AITM контракт структурирован и мгновенно доступен через GraphQL API:
contractsForFile(path: "src/pipeline/MergeQueueService.ts", projectId: "ctm-dashboard") {
id # "GM-057"
module # "Git/Merge"
behavior # "Перезапуск после self-merge ручной: после мержа dev-watch продолжает отдавать код до мержа, пока пользователь не нажмёт Restart в меню или Settings.selfMergeRestartMode не равен 'auto'."
confidence # "tested"
}
Это принципиальное отличие от статической документации. Агент запрашивает контракт ещё до того, как откроет или напишет хотя бы одну строку кода. Он не действует вслепую, не тратит контекст впустую и точно знает, какой вес придать правилу.
Экономим токены и вычислительное время: Claude Sonnet на низком или среднем effort
Одно из главных преимуществ точного наведения через контракты - эффективность самой модели ИИ.
В AITM наши агенты работают на Claude Sonnet с настройкой effort (thinking) от низкого до среднего. Когда у модели есть точный контракт, ей не нужны минуты "размышлений", спекуляции об архитектуре всего репозитория и сжигание огромного бюджета reasoning на тривиальный поиск.
Благодаря контракту модель получает в руки готовую карту:
- Она точно знает, в какой файл идти.
- Она знает ожидаемое поведение (
behavior). - Она знает, насколько можно доверять информации (
confidence).
Даже при меньшем effort Claude Sonnet выдаёт полностью детерминированную и чистую работу, потому что ему не нужно полагаться на собственную "догадку": он строго следует заданной спецификации.
Результат на 500K строк кода
Настоящая сила этого подхода проявляется не в первые дни проекта, а тогда, когда кодовая база вырастает до масштабов enterprise.
В нашей собственной системе с более чем 500 000 строк кода сегодня надёжно работает около 3 500 контрактов:
- Конец слепому grep: Агент не перебирает сотни файлов, а идёт сразу наверняка.
- Радикальное сокращение токенов и галлюцинаций: Контекстное окно остаётся чистым, и модель не страдает от информационной перегрузки.
- Стабильные результаты: Даже на проекте в полмиллиона строк ИИ достигает той же скорости и точности, что и на первом промпте в пустом репозитории.