Git-мост и AI-код-ревью
Управляемый мост 1С в Git с авто-PR/MR по 7 провайдерам, реактивное AI-код-ревью на локальной LLM, блокирующий гейт качества и SAST-подстраховка.
Управляемый мост 1С в Git превращает конфигурацию 1С в файлы в git-репозитории компании и надстраивает командные процессы: авто-PR/MR, реактивное код-ревью на локальной LLM, блокирующий гейт качества и SAST-подстраховку. Поддерживаются 7 провайдеров: GitLab, GitHub, Gitea, Bitbucket Cloud и Server, GitVerse, GitFlic.
Коммиты конфигурации
По обновлению выгрузки конфигурации (и по требованию) мост идемпотентно коммитит конфигурацию-как-файлы в git-репозиторий клиента: при пустом диффе коммит не создаётся, и повторный прогон не плодит пустых коммитов. Источник диффабельности это текстовый формат дампа (XML Конфигуратора).
Токен доступа к репозиторию хранится запечатанным в keystore и маскируется в интерфейсе. Управление мостами: /web/admin/git-bridge, доступ разграничен RBAC.
Ветки и синхронизация
Мост ведёт ветку mcp-1c/config (создаёт её идемпотентно, если ветки нет) и пушит без перезаписи: при расхождении удалённой ветки push отклоняется, удалённая история не переписывается. Обратное чтение фиксирует удалённый HEAD и состояние синхронизации; в админке бейдж статуса (в синхроне, расходится, ожидание) и кнопка синхронизации по требованию.
Аутентификация: HTTPS-токен или SSH-ключ. Ключ хранится в зашифрованном виде, форма только на запись, в интерфейсе показывается маска; проверка host-key выполняется fail-closed. Целевую ветку можно задать на каждый мост отдельно, а учётные данные вести именованным пулом на всю установку: запись пула, используемую мостом, удалить нельзя.
Авто-PR/MR
После публикации ветки мост автоматически открывает у провайдера запрос на слияние и поддерживает его актуальным: один запрос на ветку (find-or-create), повторный проход обновляет существующий и не создаёт дубликатов. Токен API передаётся только в заголовке Authorization, перенаправления на чужой хост отклоняются. В админке бейдж статуса запроса и ссылка на него.
Входящие вебхуки
Событие push или запроса на слияние от провайдера запускает синхронизацию немедленно, без ожидания опроса. Приёмник вебхуков защищён:
- подпись HMAC или общий секрет, сравнение за постоянное время; секрет берётся из конфигурации, а не из заголовка запроса;
- любой сбой (неверная подпись, неизвестный токен, отсутствие конфигурации) даёт единый ответ 404 без утечки факта существования endpoint;
- в адресе вебхука отдельный неперечислимый токен;
- повторные доставки дедуплицируются, частота ограничивается в памяти до обращения к базе данных;
- секрет вебхука хранится запечатанным, форма только на запись.
В админке бейдж последнего события и готовый адрес вебхука для вставки у провайдера.
Провайдеры
Все провайдеры реализуют один абстрактный коннектор, специфика изолирована внутри реализации:
- GitLab, GitHub, Gitea: полный набор, включая принудительный гейт через статус коммита.
- Bitbucket Cloud и Bitbucket Server / Data Center: тот же интерфейс, включая статус коммита и вебхуки с HMAC.
- GitVerse и GitFlic: у этих платформ нет API статуса коммита, поэтому гейт качества там честно советующий (advisory): вердикт публикуется в комментарии, а ложно-зелёного статуса не бывает; на остальных провайдерах гейт остаётся принудительным.
Зеркалирование на несколько remote
Мост может зеркалить каждый push на дополнительные remote сверх основного. Основной push это источник истины: зеркала отрабатывают только после его успеха, каждое в отдельности и с ограниченным таймаутом. Сбой зеркала (недоступность, отказ аутентификации, неускоряемое обновление) записывается в поле последней ошибки и никогда не блокирует и не роняет основной push; зеркало никогда не делает force-push.
Зеркало это новый канал выхода всего репозитория конфигурации, поэтому хост каждого зеркала проверяется на принадлежность контуру (on-prem) fail-closed и при сохранении настройки, и при каждом push. Внешнее зеркало возможно только через явное разрешение на конкретное зеркало, и такое разрешение записывается в аудит событием git_bridge.mirror.external_allowed. Токен каждого зеркала хранится запечатанным. Управление: /web/admin/git-bridge/{id}/mirrors.
AI-код-ревью
По событию запроса на слияние (через входящий вебхук, без ожидания опроса) воркер ревью берёт изменённые файлы у провайдера и правила команды и прогоняет их через локальную (on-prem) LLM, а сводный комментарий с замечаниями публикует обратно в запрос.
- Исходный код уходит только на локальную LLM. Адрес модели проверяется по хосту: петля, частная сеть или список разрешённых; публичный адрес отклоняется ещё до отправки кода.
- Один комментарий на запрос. Повторный прогон обновляет тот же комментарий по подписанному маркеру; дубликаты не создаются, маркер нельзя подделать.
- Инлайн-замечания. Каждое замечание дополнительно публикуется отдельным инлайн-комментарием к файлу и строке диффа по всем провайдерам. Инлайн строго best-effort: промах позиционирования никогда не влияет на сводный комментарий и вердикт гейта; замечания без позиции сворачиваются в сводку.
- Действуют ограничения по объёму изменений и частоте запусков; функция выключена по умолчанию, строгость ревью настраивается.
Блокирующий гейт качества
Гейт превращает ревью в принудительную проверку: воркер выставляет статус-проверку провайдера (пройдено или не пройдено) на head-коммит запроса на слияние, и защита веток у клиента блокирует слияние, если есть замечания не ниже выбранного порога важности.
- Fail-closed. Статус ставится только когда ревью реально оценило изменения; иначе статус остаётся «ожидание», и слияние не проходит.
- Статус ставится на тот же коммит, который проверялся, а не на устаревший.
- Текст диффа изолируется от инструкций модели: подмена вердикта через комментарии в ревьюируемом коде (prompt-инъекция) не проходит.
- Порог важности и сам гейт настраиваются в админке; по умолчанию гейт выключен.
SAST-подстраховка
Параллельно LLM изменения проверяет детерминированный SAST-анализатор, и гейт считает объединение находок обоих: даже если prompt-инъекция принудила LLM к пустой оценке, детерминированная находка всё равно блокирует слияние.
Правила детерминированного пола:
Выполнить/Execute/Evalи включение привилегированного режима: Critical, блокирует;- зашитый секрет или строка подключения: Error, блокирует;
Вычислитьи пустой блок Попытка-Исключение: Warning, советующее.
Анализируются только добавленные строки диффа, с учётом кириллических границ слова и с вычищенными комментариями. Подстраховка работает всегда и не отключается.
Динамика ревью
Дашборд /web/admin/review-metrics показывает динамику гейта: пройдено и не пройдено во времени, находки по важности, атрибуция LLM против SAST (включая случаи, где слияние заблокировала именно детерминированная находка), разрез по провайдерам и советующий против принудительного режима.
Панель AI-триажа на той же странице суммаризирует тренды и кластеризует повторяющиеся типы находок через ту же локальную (on-prem) LLM; сообщения находок LLM проходят редактирование секретов перед сохранением. Выключено по умолчанию, включается переменной AI_TRIAGE_ENABLED. Плитка здоровья гейта выведена и на Control Tower.