AI Review через Jira и Multica
Цель — встроить универсального AI reviewer в привычный Jira-процесс. Команда назначает задачу на одну цифровую личность Reviewer, а Multica под капотом собирает мультирепозиторный контекст, выполняет review и возвращает итог обратно в Jira.
Что именно решаем
Рабочий контекст продукта
Пилотная конфигурация в Multica
Агенты
Лёгкая модель, например Codex Spark. Coordinator не делает глубокий анализ кода: он принимает события, выбирает слот, запускает Python-процессы, создаёт review issue и публикует итог в Jira.
Один универсальный агент, который может работать с issue в любом slot project. Он не разделяется на клиентского и серверного reviewer и получает только read-only доступ к уже подготовленному workspace.
Pipeline review: от Jira hook до возврата задачи
Принять запрос
Jira assignment hook запускает Coordinator и фиксирует новый review-run.
Задача назначена на Reviewer
Autopilot получает issue key, пользователя, который отправил задачу на review, и комментарии с ветками и служебным контекстом.
Разобрать change set
Coordinator определяет тип задачи и находит в нужных repo коммиты, в сообщениях которых есть ключ этой Jira-задачи.
Получить workspace
Coordinator резервирует свободный слот либо ставит run в очередь.
Выбрать слот или очередь
Свободный Slot 01/02 атомарно закрепляется за run. Если свободных слотов нет, run сохраняется в очереди coordinator workspace.
Запустить prepare_workspace.py
One-shot процесс выполняет fetch, reset и checkout нужных коммитов в шести repo, записывает manifest и завершается.
Получить workspace.ready
Coordinator проверяет, что manifest относится к ожидаемому run и что каждый repo находится на нужном commit SHA.
Запустить review
Coordinator создаёт issue в готовом slot project, а единый Reviewer начинает анализ.
Создать issue в выбранном slot project
Issue содержит Jira-контекст, список целевых коммитов, пути к repo, manifest и указание, что review является клиентским, серверным или cross-repo.
Провести read-only review
Reviewer проходит чеклисты, смотрит целевые коммиты и связанные участки во всех нужных repo, после чего записывает структурированный итог в собственную Multica issue.
Вернуть результат
Coordinator публикует итог и освобождает инфраструктурный ресурс.
Получить завершённую reviewer issue
Coordinator забирает итог review, проверяет наличие summary, checklist results и списка findings с точным фрагментом исходного diff, где видна причина каждого замечания.
Опубликовать review и вернуть задачу
В Jira появляется финальный rich-text комментарий с итогом, severity и абзацами по каждой находке; проблемные строки из проверяемого change set цитируются inline-diff блоками. После публикации задача возвращается тому, кто отправил её на review.
Запустить cleanup_workspace.py
Слот очищается, assignment снимается, после slot.cleaned он становится доступным для следующего run из очереди.
Очередь и повторный review
- освободившийся слот сразу забирает следующий queued run
- watchdog может периодически перепроверять очередь как резервный механизм
- после новых правок Jira-задача снова назначается на Reviewer и создаётся новый run на любом свободном слоте
- старый slot workspace и старая AI-сессия не являются состоянием процесса
Детерминированное отдельно от LLM
Coordinator запускает Python-процесс и завершает свой task. Он не держит агентную сессию открытой во время fetch, checkout или очистки.
Три skills AI Review Coordinator
new_review_from_jira
- Вход
- назначение Jira issue на Reviewer
- Действия
- прочитать комментарии, найти change set, выбрать слот или очередь, записать progress-comment
- Выход
- запущенный
prepare_workspace.pyлибо queued review-run
workspace_ready_from_python
- Вход
workspace.ready+ manifest слота- Действия
- валидировать slot/run/SHA, создать issue в нужном slot project, назначить Universal AI Reviewer
- Выход
- reviewer task запущен; Jira показывает «Ревью в слоте начато»
review_completed_from_multica
- Вход
- завершение reviewer issue
- Действия
- забрать итог, опубликовать Jira comment, вернуть задачу, запустить cleanup
- Выход
- финальное review в Jira и слот, возвращаемый в пул
Границы ответственности и доступа
Как проводится само AI review
Preflight · Mechanical и границы change set
Layer 1| Check | Проверка | Что именно проверяет Reviewer |
|---|---|---|
| ✓ | Коммиты задачи найдены полностью | Список проверяемых коммитов из каждого репозитория. Ветка каждого репозитория в слоте. |
Checklist A · Игровая логика и корректность
Layer 2| Check | Проверка | Что именно проверяет Reviewer |
|---|---|---|
| ✓ | Требование Jira реализовано | Изменение действительно решает описанную задачу и не подменяет её локально удобной, но другой логикой. |
| ✓ | Стиль согласован с проектом | Именование, структура методов, imports/usings и локальные паттерны соответствуют окружающему коду. |
| ✓ | Состояния и переходы корректны | Учтены повторный вызов, частичное выполнение, отмена, отсутствие данных, граничные значения и неожиданный порядок событий. |
| ✓ | Ошибки и fallback-пути | Исключения и невалидные состояния обрабатываются на правильном уровне; логирование даёт достаточно контекста для диагностики. |
| ✓ | Перфоманс | Нет лишних аллокаций, повторных проходов, сериализаций, дорогих lookup или сетевой работы в частых игровых и серверных путях. |
Checklist B · Архитектура, конфиги и отсутствие дубликатов
Layer 2| Check | Проверка | Что именно проверяет Reviewer |
|---|---|---|
| ✓ | Разделение ответственности | Логика находится в правильном слое, методы и классы не получают несвязанные обязанности, зависимости не запутываются без необходимости. |
| ✓ | Не создано то, что уже существует | Перед добавлением нового метода, helper, модели, конвертера или алгоритма Reviewer ищет аналог по всему проекту и отмечает дублирование существующей реализации. |
| ✓ | Параметры доступны геймдизайнерам | Балансные и продуктовые параметры не зашиты в код, а находятся в JSON-конфигах, описанных соответствующими proto-схемами. |
| ✓ | Код остаётся читаемым | Нет чрезмерной вложенности, слишком длинных методов, неочевидных side effects и скрытых предположений, которые придётся реконструировать следующему разработчику. |
Checklist C · Cross-repo и смысл изменения
Layer 3| Check | Проверка | Что именно проверяет Reviewer |
|---|---|---|
| ✓ | Клиент и сервер трактуют данные одинаково | Совпадают идентификаторы, enum, единицы измерения, сериализация, значения по умолчанию и правила перехода состояний. |
| ✓ | Изменение контракта доведено до всех repo | Если изменена модель или протокол, Reviewer проверяет все места, где контракт читается, пишется, преобразуется или хранится. |
| ✓ | Совместимость версий | Новый клиент не предполагает мгновенное обновление сервера, а сервер не требует, чтобы все игроки уже использовали новую версию клиента. |
Формат финального комментария в Jira
Обычный rich-text отчёт: вводные абзацы с ветками и проверенными коммитами, краткая сводка по чеклистам, затем несколько абзацев на каждое замечание. Путь оформляется как inline code, а точный hunk из исходного change set — как Jira code block с языком diff. Направление исправления остаётся отдельным абзацем; Reviewer не синтезирует patch вместо исходного diff.
AI Review · HC-12345
Итог. Максимальная severity: HIGH. Найдено: 1 HIGH, 1 MEDIUM, 1 LOW.
Change set. Client · HC-12345_feature · a1b2c3d; ClientCore · HC-12345_feature · d4e5f6a; shelterserver · HC-12345_feature · 7b8c9d0.
Чеклисты. Game logic — FINDINGS; Architecture & configs — FINDINGS; Cross-repo — FINDINGS.
HIGHAIR-001 · Состояние сохраняется частично
shelterserver/.../BattleService.java:184
При исключении после первого изменения часть состояния уже сохранена, а вторая остаётся старой. Клиент и сервер могут увидеть разные результаты одной игровой операции.
Исправление. Выполнить оба изменения атомарно либо добавить явную компенсацию первого шага.
Фрагмент исходного diff
@@ BattleService.java:184 @@ applyBattleResult(player, battle);+ savePlayerState(player);+ saveBattleState(battle);
MEDIUMAIR-002 · Cooldown зашит в код
Client/.../CooldownController.cs:73
Балансное значение cooldown находится в коде, хотя остальные параметры механики читаются из JSON/proto-конфига. Геймдизайнер не сможет изменить его без новой сборки, а клиентское и серверное значения могут разойтись.
Исправление. Добавить поле в proto-схему и читать его из общего JSON-конфига.
Фрагмент исходного diff
@@ CooldownController.cs:73 @@- _cooldown.Start(_config.CooldownSeconds);+ _cooldown.Start(30);
LOWAIR-003 · Дублируется правило округления
ClientCore/.../RewardUtils.cs:41
Новый helper повторяет существующий метод с тем же правилом округления. Две реализации одного правила со временем могут разойтись.
Исправление. Переиспользовать существующий общий метод.
Фрагмент исходного diff
@@ RewardUtils.cs:41 @@+ public static int CalculateReward(float value, float multiplier)+ {+ return Mathf.RoundToInt(value * multiplier);+ }
После публикации: Coordinator возвращает Jira-задачу пользователю, который отправил её на review. Если findings отсутствуют, отчёт всё равно содержит checklist summary и короткую формулировку «Замечаний не найдено».