Ты наверняка замечал, как стремительно меняется разработка: стоило дать Claude Code, Cursor или Aider свободу действий, как одиночные задачи стали решаться за минуты. Но попробуй выпустить пяток таких автономных кодеров в общий репозиторий команды без строгого надзора. Буквально через пару дней кодовая база превращается в филиал хаоса: агенты радостно лепят дублирующие утилиты, игнорируют корпоративный линтинг, сносят общие зависимости и объявляют задачу решённой, если код просто скомпилировался на коленке.
Я сам долго размышлял, как обуздать этот энтузиазм нейросетей, и подход инженера Коула Медина (Cole Medin) расставил всё по местам: к автономным кодерам нужно относиться не как к магам с волшебной палочкой, а как к обычным стажёрам в инженерном департаменте. А любому стажёру нужны прозрачные правила игры, измеримые стандарты качества и жёсткий контроль перед деплоем.
Стержнем такой фабрики разработки становится портал разработчика (Internal Developer Portal, IDP) — в частности, платформа Port (getport.io), выполняющая роль единого каталога сервисов (Software Catalog) и автоматического арбитра зрелости кода (Service Scorecards).
Архитектура фабрики: от каталога до уровней зрелости
Вместо того чтобы скармливать агенту весь монолит наугад, каждый сервис регистрируется в Port через сущность Blueprint. В ней чётко зафиксированы язык, репозиторий на GitHub или GitLab, команда-владелец и актуальная спецификация API (OpenAPI или AsyncAPI). Когда агент получает задачу, он черпает контекст не из догадок, а из зарегистрированного паспорта сервиса.
Главный инструмент дисциплины здесь — скоркарды зрелости (Service Scorecards), разбитые на понятные грейды:
- Bronze: базовый уровень гигиены. Наличие внятного README, валидного Dockerfile и успешное прохождение сборки.
- Silver: инженерный стандарт. Покрытие unit-тестами не менее 70%, интеграция SAST-сканера уязвимостей и отсутствие критических замечаний линтера.
- Gold: готовность к высоким нагрузкам. Настроенный CI/CD пайплайн в production, мониторинг SLO/SLA и свежие версии библиотек без устаревших уязвимостей.
Вот как выглядит декларативное описание скоркарда зрелости сервиса в формате YAML для Port:
scorecard:
identifier: production_readiness
title: "Production Readiness Scorecard"
blueprint: microservice
levels:
- name: Bronze
rules:
- identifier: has_readme
title: "README.md exists in root"
query:
property: has_readme
operator: "="
value: true
- identifier: build_status
title: "Main branch build is passing"
query:
property: last_build_status
operator: "="
value: "success"
- name: Silver
rules:
- identifier: test_coverage
title: "Unit test coverage >= 70%"
query:
property: test_coverage_pct
operator: ">="
value: 70
- identifier: no_critical_bugs
title: "Zero critical security alerts"
query:
property: critical_vulnerabilities
operator: "="
value: 0
Замкнутый цикл: упал тест — агент пошёл чинить
Самое красивое в этой связке — автоматический цикл самоисцеления (Self-Healing Loop). Представь: ночью в ветке main ломается сборка или стороннее обновление библиотеки роняет тестовое покрытие ниже 70%. Сервис немедленно теряет статус Silver в Port.

В этот момент срабатывает автоматизация Port Automations. Webhook отправляет событие на оркестратор агентов (например, связку на FastAPI или LangGraph). Запрос несёт не абстрактный крик о помощи, а точный контекст: diff последнего коммита, журнал упавшего теста и ссылку на упавшее правило скоркарда.
Агент в изолированном контейнере клонирует репозиторий, разворачивает окружение, воспроизводит ошибку локально и подбирает исправление.
# Образец полезной нагрузки webhook от Port к оркестратору агентов
curl -X POST https://agent-orchestrator.internal/api/v1/self-heal \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${INTERNAL_ROUTER_TOKEN}" \
-d '{
"event": "scorecard.level_dropped",
"service_id": "auth-service-v2",
"repository": "github.com/company/auth-service-v2",
"target_branch": "fix/auth-test-regression",
"failed_rule": "test_coverage_pct",
"current_value": 64.5,
"required_value": 70.0,
"last_failed_test": "tests/test_oauth_refresh.py"
}'
Автономный агент создаёт Pull Request строго в отдельную ветку с префиксом [AI-Fix]. Прямой пуш в защищённые ветки закрыт на уровне правил репозитория. Токен доступа агента (GitHub PAT) наделяется минимальными правами pull-requests: write. Слияние в основную ветку происходит только после финального аппрува тимлида или дежурного инженера.
Опыт внедрения подобных агентных процессов в крупных компаниях показывает, что ключевая сложность лежит не в мощности языковой модели, а в дисциплине процессов. Об этом мы подробно говорили при разборе методологии Forward Deployed Engineer: пока ты не оцифруешь правила приемки для людей, ИИ будет лишь умножать технический долг.
В бесплатных тарифах Port доступен для команд до 15 пользователей, чего с головой хватает для отладки фабрики. Главное — сразу выставить агентам лимиты на число итераций и время работы, чтобы зациклившийся на сложном баге скрипт не сжёг месячный бюджет на токены за одну бессонную ночь.
