AI Review · Jira UX · Multica under the hood

AI Review через Jira и Multica

Цель — встроить универсального AI reviewer в привычный Jira-процесс. Команда назначает задачу на одну цифровую личность Reviewer, а Multica под капотом собирает мультирепозиторный контекст, выполняет review и возвращает итог обратно в Jira.

Что именно решаем

1
Единый UX через JiraПользователь не открывает отдельный интерфейс. Он назначает issue на Reviewer и получает итоговый комментарий в той же задаче.
2
Контекст из нескольких репозиториевClient, ClientCore и четыре серверных repo лежат в одной продуктовой рабочей папке, но остаются независимыми Git-репозиториями.
3
Review конкретных коммитов задачиReviewer проверяет коммиты, в сообщении которых содержится Jira issue key. Новый набор правок создаёт новый независимый review-run.

Рабочий контекст продукта

Client ClientCore shelterserver sheltershared shelteradmin shelterresourceconverter
6 независимых Git repo
Из Jira-комментария Coordinator получает ветки и служебный контекст, находит нужные коммиты и передаёт детерминированному Python-скрипту точное описание того, что должно оказаться в slot workspace.

Пилотная конфигурация в Multica

Пилот состоит всего из двух частей: инфраструктурный контур с тремя workspace и два агента. AI Reviewer один; слоты не являются его репликами.
1

Runtime и workspace

1 Runtime · 3 Multica projects
Coordinator ProjectWorkspace координатора: состояние Slot 01/02, очередь review-run, manifests, служебные JSON и orchestration state.
Review Slot 01Первая независимая локальная директория с шестью Git repo, подготавливаемая под конкретный review-run.
Review Slot 02Вторая идентичная локальная директория для параллельного пилотного review.
Два слота ограничивают файловый параллелизм и позволяют проверить очередь, не создавая отдельные workspace под каждую Jira-задачу.
2

Агенты

AI Review Coordinator

Лёгкая модель, например Codex Spark. Coordinator не делает глубокий анализ кода: он принимает события, выбирает слот, запускает Python-процессы, создаёт review issue и публикует итог в Jira.

Universal AI Reviewer

Один универсальный агент, который может работать с issue в любом slot project. Он не разделяется на клиентского и серверного reviewer и получает только read-only доступ к уже подготовленному workspace.

В Jira тоже существует одна цифровая личность: Reviewer. Skills самого reviewer детализируем отдельно; здесь фиксируется только его роль и граница доступа.

Pipeline review: от Jira hook до возврата задачи

Coordinator редактирует один служебный progress-комментарий. Видимых состояний мало: только четыре пользовательски значимых этапа, без технического шума.
Jira status
Координатор запрос принял
Jira status
Ожидание слотаили: Подготовка слота
Jira status
Ревью в слоте начато
Финал в Jira
Публикуется само reviewзадача возвращается исполнителю
Этап 1

Принять запрос

Jira assignment hook запускает Coordinator и фиксирует новый review-run.

Шаг 1Jira hook

Задача назначена на Reviewer

Autopilot получает issue key, пользователя, который отправил задачу на review, и комментарии с ветками и служебным контекстом.

Статус JiraКоординатор запрос принял
Шаг 2Coordinator

Разобрать change set

Coordinator определяет тип задачи и находит в нужных repo коммиты, в сообщениях которых есть ключ этой Jira-задачи.

Статус JiraКоординатор запрос принял
Этап 2

Получить workspace

Coordinator резервирует свободный слот либо ставит run в очередь.

Шаг 3Coordinator

Выбрать слот или очередь

Свободный Slot 01/02 атомарно закрепляется за run. Если свободных слотов нет, run сохраняется в очереди coordinator workspace.

Статус JiraОжидание слота
Шаг 4Python process

Запустить prepare_workspace.py

One-shot процесс выполняет fetch, reset и checkout нужных коммитов в шести repo, записывает manifest и завершается.

Статус JiraПодготовка слота
Шаг 5Python callback

Получить workspace.ready

Coordinator проверяет, что manifest относится к ожидаемому run и что каждый repo находится на нужном commit SHA.

Статус JiraПодготовка слота
Этап 3

Запустить review

Coordinator создаёт issue в готовом slot project, а единый Reviewer начинает анализ.

Шаг 6Multica issue

Создать issue в выбранном slot project

Issue содержит Jira-контекст, список целевых коммитов, пути к repo, manifest и указание, что review является клиентским, серверным или cross-repo.

Статус JiraРевью в слоте начато
Шаг 7AI Reviewer

Провести read-only review

Reviewer проходит чеклисты, смотрит целевые коммиты и связанные участки во всех нужных repo, после чего записывает структурированный итог в собственную Multica issue.

Статус JiraРевью в слоте начато
Этап 4

Вернуть результат

Coordinator публикует итог и освобождает инфраструктурный ресурс.

Шаг 8Multica hook

Получить завершённую reviewer issue

Coordinator забирает итог review, проверяет наличие summary, checklist results и списка findings с точным фрагментом исходного diff, где видна причина каждого замечания.

Статус JiraРевью в слоте начато
Шаг 9Jira R/W

Опубликовать review и вернуть задачу

В Jira появляется финальный rich-text комментарий с итогом, severity и абзацами по каждой находке; проблемные строки из проверяемого change set цитируются inline-diff блоками. После публикации задача возвращается тому, кто отправил её на review.

JiraПубликуется само review; задача возвращается
Шаг 10Python process

Запустить cleanup_workspace.py

Слот очищается, assignment снимается, после slot.cleaned он становится доступным для следующего run из очереди.

JiraПубликуется само review; задача возвращается

Очередь и повторный review

  • освободившийся слот сразу забирает следующий queued run
  • watchdog может периодически перепроверять очередь как резервный механизм
  • после новых правок Jira-задача снова назначается на Reviewer и создаётся новый run на любом свободном слоте
  • старый slot workspace и старая AI-сессия не являются состоянием процесса

Детерминированное отдельно от LLM

Coordinator запускает Python-процесс и завершает свой task. Он не держит агентную сессию открытой во время fetch, checkout или очистки.

Три skills AI Review Coordinator

Skills Coordinator соответствуют трём видам входящих событий. Это позволяет не делать один огромный оркестратор с неявной логикой продолжения.
Skill 01 · Jira hook

new_review_from_jira

Вход
назначение Jira issue на Reviewer
Действия
прочитать комментарии, найти change set, выбрать слот или очередь, записать progress-comment
Выход
запущенный prepare_workspace.py либо queued review-run
Skill 02 · Python callback

workspace_ready_from_python

Вход
workspace.ready + manifest слота
Действия
валидировать slot/run/SHA, создать issue в нужном slot project, назначить Universal AI Reviewer
Выход
reviewer task запущен; Jira показывает «Ревью в слоте начато»
Skill 03 · Multica hook

review_completed_from_multica

Вход
завершение reviewer issue
Действия
забрать итог, опубликовать Jira comment, вернуть задачу, запустить cleanup
Выход
финальное review в Jira и слот, возвращаемый в пул
Skills Universal AI Reviewer в этой версии proposal не раскладываются на отдельные системные skills. Вместо этого ниже фиксируется его review-контракт: какие чеклисты он проходит и в каком формате возвращает findings.

Границы ответственности и доступа

Reviewer остаётся действительно read-only: он анализирует подготовленное состояние, но не управляет Jira, слотами или Python-процессами.

Permissions matrix

минимально необходимые права для каждой роли
Component Jira Python runner Coordinator state Slot files Git repos Multica issues
AI Review Coordinator R/W spawn / status R/W manifest / state через prepare logic create / read
Python prepare / cleanup process status callback R/W fetch / reset / checkout
Universal AI Reviewer read-only read-only context own issue
полноценный доступ ограниченный / read-only служебный процесс нет доступа

Как проводится само AI review

Reviewer анализирует код игры по явным чеклистам. Результат — обычный rich-text Jira-comment с кратким summary, абзацами по находкам и точными фрагментами проверяемого diff.
Pass 1Собрать change setНайти все коммиты с issue key и построить diff по затронутым repo.
Pass 2Пройти чеклистыПроверить корректность, архитектуру, конфиги, дубликаты и стоимость изменения.
Pass 3Проверить связиПосмотреть вызовы, модели и контракты вне строк изменённого diff.
Pass 4Собрать Jira-reportНазначить severity, дать точную локацию, риск и направление исправления.

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 и короткую формулировку «Замечаний не найдено».