AI Review with Jira and Multica
The goal is to integrate a universal AI reviewer into the familiar Jira workflow. The team assigns an issue to a single digital identity, Reviewer, while Multica assembles multi-repository context behind the scenes, performs the review, and returns the result to Jira.
What we are solving
Product working context
Pilot configuration in Multica
Agents
A lightweight model such as Codex Spark. Coordinator does not perform deep code analysis: it receives events, selects a slot, starts Python processes, creates the review issue, and publishes the result in Jira.
One universal agent that can work with an issue in any slot project. It is not split into client and server reviewers and receives only read-only access to an already prepared workspace.
Review pipeline: from a Jira hook to handing the issue back
Accept the request
The Jira assignment hook starts Coordinator and records a new review run.
Issue assigned to Reviewer
Autopilot receives the issue key, the user who sent the issue for review, and comments containing branches and operational context.
Resolve the change set
Coordinator determines the task type and finds commits in the relevant repositories whose messages contain this Jira issue key.
Obtain a workspace
Coordinator reserves an available slot or puts the run in the queue.
Select a slot or queue
An available Slot 01/02 is atomically assigned to the run. If no slots are available, the run is stored in the coordinator workspace queue.
Start prepare_workspace.py
A one-shot process fetches, resets, and checks out the required commits in six repositories, writes a manifest, and exits.
Receive workspace.ready
Coordinator verifies that the manifest belongs to the expected run and that every repository is at the required commit SHA.
Start the review
Coordinator creates an issue in the prepared slot project, and the single Reviewer begins its analysis.
Create an issue in the selected slot project
The issue contains Jira context, the list of target commits, repository paths, the manifest, and an indication of whether the review is client-side, server-side, or cross-repository.
Perform a read-only review
Reviewer follows the checklists, inspects the target commits and related code across every relevant repository, then writes a structured result into its own Multica issue.
Return the result
Coordinator publishes the result and releases the infrastructure resource.
Receive the completed reviewer issue
Coordinator retrieves the review result and verifies that it contains a summary, checklist results, and a findings list with the exact fragment of the source diff that demonstrates the reason for every finding.
Publish the review and return the issue
Jira receives a final rich-text comment with the conclusion, severity, and a paragraph for every finding; problematic lines from the reviewed change set are quoted in inline diff blocks. After publication, the issue returns to the person who sent it for review.
Start cleanup_workspace.py
The slot is cleaned, its assignment is removed, and after slot.cleaned it becomes available to the next run in the queue.
Queue and repeat review
- the next queued run immediately takes a released slot
- a watchdog can periodically recheck the queue as a fallback mechanism
- after new changes, the Jira issue is assigned to Reviewer again and a new run is created in any available slot
- neither the old slot workspace nor the old AI session is process state
Keep deterministic work separate from the LLM
Coordinator starts a Python process and completes its task. It does not keep an agent session open during fetch, checkout, or cleanup.
Three AI Review Coordinator skills
new_review_from_jira
- Input
- assignment of a Jira issue to Reviewer
- Actions
- read comments, find the change set, select a slot or queue, write the progress comment
- Output
- a started
prepare_workspace.pyprocess or a queued review run
workspace_ready_from_python
- Input
workspace.ready+ slot manifest- Actions
- validate slot/run/SHA, create an issue in the required slot project, assign Universal AI Reviewer
- Output
- the reviewer task is running; Jira shows “Review started in the slot”
review_completed_from_multica
- Input
- completion of a reviewer issue
- Actions
- retrieve the result, publish the Jira comment, return the issue, start cleanup
- Output
- the final review in Jira and a slot returned to the pool
Boundaries of responsibility and access
How the AI review itself works
Preflight · Mechanical checks and change-set boundaries
Layer 1| Check | Verification | What Reviewer checks |
|---|---|---|
| ✓ | All task commits were found | The list of reviewed commits from every repository. The branch of every repository in the slot. |
Checklist A · Game logic and correctness
Layer 2| Check | Verification | What Reviewer checks |
|---|---|---|
| ✓ | The Jira requirement is implemented | The change genuinely solves the described task instead of replacing it with different logic that is locally convenient. |
| ✓ | Style is consistent with the project | Naming, method structure, imports/usings, and local patterns match the surrounding code. |
| ✓ | States and transitions are correct | Repeated calls, partial execution, cancellation, missing data, boundary values, and unexpected event order are handled. |
| ✓ | Errors and fallback paths | Exceptions and invalid states are handled at the correct level; logging provides enough context for diagnosis. |
| ✓ | Performance | There are no unnecessary allocations, repeated passes, serialization, expensive lookups, or network work on frequent game and server paths. |
Checklist B · Architecture, configuration, and no duplication
Layer 2| Check | Verification | What Reviewer checks |
|---|---|---|
| ✓ | Separation of concerns | Logic resides in the correct layer, methods and classes do not acquire unrelated responsibilities, and dependencies are not tangled unnecessarily. |
| ✓ | Existing functionality was not recreated | Before adding a method, helper, model, converter, or algorithm, Reviewer searches the entire project for an equivalent and flags duplication of an existing implementation. |
| ✓ | Parameters are editable by game designers | Balance and product parameters are not hard-coded but stored in JSON configuration described by the corresponding proto schemas. |
| ✓ | The code remains readable | There is no excessive nesting, overly long methods, non-obvious side effects, or hidden assumptions for the next developer to reconstruct. |
Checklist C · Cross-repository consistency and intent
Layer 3| Check | Verification | What Reviewer checks |
|---|---|---|
| ✓ | Client and server interpret data identically | Identifiers, enums, units, serialization, default values, and state-transition rules match. |
| ✓ | Contract changes reach every repository | If a model or protocol changes, Reviewer checks every place where the contract is read, written, converted, or stored. |
| ✓ | Version compatibility | A new client does not assume an immediate server update, and the server does not require every player to already use the new client version. |
Final Jira comment format
A regular rich-text report: introductory paragraphs with branches and reviewed commits, a concise checklist summary, then several paragraphs for every finding. The path is formatted as inline code, and the exact hunk from the source change set as a Jira code block with the diff language. The direction for a fix remains a separate paragraph; Reviewer does not synthesize a patch in place of the source diff.
AI Review · HC-12345
Summary. Maximum severity: HIGH. Found: 1 HIGH, 1 MEDIUM, 1 LOW.
Change set. Client · HC-12345_feature · a1b2c3d; ClientCore · HC-12345_feature · d4e5f6a; shelterserver · HC-12345_feature · 7b8c9d0.
Checklists. Game logic — FINDINGS; Architecture & configs — FINDINGS; Cross-repo — FINDINGS.
HIGHAIR-001 · State is persisted only partially
shelterserver/.../BattleService.java:184
If an exception occurs after the first change, part of the state has already been persisted while the rest remains stale. The client and server may observe different outcomes for the same game operation.
Fix. Apply both changes atomically or add explicit compensation for the first step.
Source diff fragment
@@ BattleService.java:184 @@ applyBattleResult(player, battle);+ savePlayerState(player);+ saveBattleState(battle);
MEDIUMAIR-002 · Cooldown is hard-coded
Client/.../CooldownController.cs:73
The cooldown value is hard-coded even though the mechanic’s other parameters come from JSON/proto configuration. A game designer cannot change it without a new build, and the client and server values may diverge.
Fix. Add a field to the proto schema and read it from the shared JSON configuration.
Source diff fragment
@@ CooldownController.cs:73 @@- _cooldown.Start(_config.CooldownSeconds);+ _cooldown.Start(30);
LOWAIR-003 · Rounding rule is duplicated
ClientCore/.../RewardUtils.cs:41
The new helper repeats an existing method with the same rounding rule. Two implementations of one rule may diverge over time.
Fix. Reuse the existing shared method.
Source diff fragment
@@ RewardUtils.cs:41 @@+ public static int CalculateReward(float value, float multiplier)+ {+ return Mathf.RoundToInt(value * multiplier);+ }
After publication: Coordinator returns the Jira issue to the user who sent it for review. If there are no findings, the report still contains a checklist summary and the short statement “No findings.”