Home / Stories / Multi-persona MR review
Story · Review In development

Three reviewers on your MR, and a note on where they disagree.

An engineer opens a merge request by hand: a chart bump plus one extra setting. Someone types /review all. Several reviewer personas read it in parallel, each backed by a different model and each saying which one. A final comment tallies the verdicts and pulls out the one finding only one of them caught.

Starts fromAny open MR: the assistant added as a reviewer, or a /review comment.
Looks atThe diff, the MR description, and the files around it in the repository.
You getOne comment per persona with its verdict and model, a synthesis comment, and a searchable verdict label.
01 · A human-written MR

Not every change comes from the bot.

Here an engineer bumps ingress-nginx by a minor and, in the same MR, turns on allowSnippetAnnotations so one team can add a custom header. Two lines, easy to approve on a Friday.

02 · Ask for a review

Add the bot as a reviewer, or comment.

Putting the assistant in the MR's reviewers list runs the default persona once per commit. A /review comment does the same; /review all runs every configured persona; /review premium runs just one.

Only people on the trigger allowlist can start a review by comment. Unknown persona names are dropped with a warning and the rest still run.

03 · Personas, in parallel

A stable name in front, a swappable model behind.

Personas are the interface your team learns: default for a balanced review, premium for high-stakes MRs, quick for a cheap second opinion. Each maps to a model profile in configuration. When a better model ships, the pointer changes and nothing else does.

Reviews are keyed on MR, commit and persona, so a persona never reviews the same commit twice. A force-push makes it eligible again.

04 · Read more than the diff

Check the claims against the repository.

Each reviewer sees the diff and the MR description, and can be given read-only tools to open neighbouring files: the values the chart already sets, the Ingress objects that would use the new setting In development.

An approval that needed evidence it did not have (a changelog, a CRD schema) is marked contested rather than passed through as a clean yes.

05 · One comment per persona

Every header names the persona and the model.

You always know which model produced which opinion. Each comment carries a verdict, a quality score, what was verified and what worries it, and the commit it reviewed.

Here two personas approve. premium requests changes: the snippet setting lets anyone who can write an Ingress inject NGINX configuration, which is why the chart turned it off by default.

06 · The synthesis

Where they agree, and the finding only one of them made.

When two or more personas ran, a synthesis comment tallies the verdicts, lists shared concerns and highlights unique findings. A lone dissent is not averaged away; it is the headline.

07 · A label you can filter on

The worst verdict wins.

The MR is stamped review::LGTM, review::NC or review::COMMENT, taking the most cautious persona's verdict. A re-review replaces the label, so the MR list always shows the current state.

08 · Bot MRs get a second reviewer

An independent review with no pipeline context.

The assistant's own reviewer shares its prompts and its blind spots. So every MR the assistant opens is also read cold by an independent reviewer that knows nothing about how the MR was produced. It checks that the title matches the diff, that nothing secret leaked, and that the change lands somewhere that is actually deployed.

Its verdict is a separate label: xrev::LGTM, xrev::NC (needs changes) or xrev::DNM (do not merge).

!88 · ingress-nginx 4.10.1 → 4.11.2, allow snippets for checkout · by sam
infrastructure/ingress/helmrelease_ingress-nginx.yaml
      chart: ingress-nginx
-     version: 4.10.1
+     version: 4.11.2
  values:
    controller:
+     allowSnippetAnnotations: true
      replicaCount: 3
author: human · 1 file · +2 −1 · pipeline green
!88 · activity
S
sam requested review from gitops-assistant
reviewers: priya, gitops-assistant
P
priya commented
touches the edge for every team, let's get all three on it
/review all
G
gitops-assistant
/review allhead_sha a41c07e · 3 personas, none reviewed yet
defaultQwen3.5-397B
premiumClaude Opus 4.7
quickClaude Haiku 4.5
run in parallel · bounded by max_parallel_reviews · models are examples, set per install
premium · read-only repo tools · 3 calls
 read_repo_file(infrastructure/ingress/helmrelease_ingress-nginx.yaml)
  controller.config: none · no snippet allow-list
 list_repo_dir(apps/)
  31 Ingress objects across 9 namespaces
 read_repo_file(apps/checkout/ingress.yaml)
  configuration-snippet: more_set_headers "X-Frame…"
quick · evidence check
  • diff matches the title
  • 4.10 → 4.11 changelog not available to this persona
  • verdict: approve → marked contested
!88 · discussion
G
✅ Review — persona: default — model: qwen3.5-397b — approve
Quality 84/100 · chart name unchanged, replicaCount preserved.
G
❌ Review — persona: premium — model: claude-opus-4-7 — request_changes
Quality 91/100 · allowSnippetAnnotations is cluster-wide: any namespace that can create an Ingress can inject NGINX config. Only checkout needs a header; use a controller.addHeaders entry or scope it with an admission policy.
G
✅ Review — persona: quick — model: claude-haiku-4-5 — approve
Quality 78/100 · ⚠ contested: approved without changelog evidence for 4.10 → 4.11.
🧭 Review synthesis across personas: default, premium, quick
approve
2
request changes
1
shared concerns
0
read alongside the individual persona comments above
Merge requests · label = review::NC
  • !88 ingress-nginx 4.10.1 → 4.11.2, allow snippets for checkout review::NC
  • !85 cert-manager: raise renewBefore to 30d review::LGTM
  • !83 split monitoring values per environment review::COMMENT
worst persona verdict wins: request_changes › comment › approve
!88 · after force-push b92e310
-     allowSnippetAnnotations: true
+     addHeaders: { X-Frame-Options: DENY }
/review premium  →  approve · label replaced: review::LGTM
Bot MRgitops-ai/…
Independent reviewerdiff + repo only
Verdict labelxrev::…
independent review · no pipeline context
  • title matches the diff scope
  • no credentials or tokens in the diff leak check
  • target file is reconciled by a Kustomization placement
  • no same-file MR already open siblings
xrev::LGTMxrev::NCxrev::DNM

The review thread you get.

Illustrative. The comment headers, the synthesis and the label scopes follow the format the reviewer writes; the model names are examples and are set per installation.

Open

ingress-nginx 4.10.1 → 4.11.2, allow snippets for checkout

from sam/ingress-nginx-4.11 into main · 1 file · +2 −1 · reviewers: priya, gitops-assistant
review::NC
premiumdefaultquickSynthesis
❌ Review — persona: premium — model: claude-opus-4-7 — request_changes

Quality: 91/100

The version bump is fine on its own. The second change is not scoped to what the MR description asks for.

✅ Verified
  • chart name and source unchanged
  • replicaCount and existing values preserved byte-identical
  • 4.11.x is a minor line; no values renames that touch this release
⚠️ Concerns
  • controller.allowSnippetAnnotations: true applies to every Ingress in the cluster (31 objects, 9 namespaces). Any team that can write an Ingress can then inject NGINX configuration. The chart defaults this to off for that reason.
  • The need in the description is one response header for checkout. controller.addHeaders (or a per-host header ConfigMap) covers it without enabling snippets.

Generated by the GitOps Assistant reviewer · head_sha a41c07e

✅ Review — persona: default — model: qwen3.5-397b — approve

Quality: 84/100

✅ Verified
  • chart name unchanged
  • spec.values preserved apart from the one added key
⚠️ Concerns
  • Snippet annotations widen what Ingress authors can configure; confirm this is intended.

Generated by the GitOps Assistant reviewer · head_sha a41c07e

✅ Review — persona: quick — model: claude-haiku-4-5 — approve

Quality: 78/100

LGTM: minor chart bump, one values addition.

Generated by the GitOps Assistant reviewer · head_sha a41c07e

🧭 Review synthesis across personas: default, premium, quick

2/3 personas approve; premium requests changes. Shared concern: none that all three raised. default noted the snippet setting but did not block on it.

Unique finding: premium showed that the snippet setting is cluster-wide while the need is one header for one service, and named a narrower alternative. The operator should resolve this before merging.

quick's approval is marked contested: it lacked changelog evidence.

Synthesis produced by the GitOps Assistant reviewer. Read alongside the individual persona comments.

S
sam pushed b92e310

Fair, switched to addHeaders. /review premium

G
✅ Review — persona: premium — model: claude-opus-4-7 — approve head_sha b92e310

Snippets stay disabled; the header is set globally by the controller, which matches the stated need. Label updated to review::LGTM.

What keeps it honest.

A reviewer that agrees with everything is worse than none. These are the rules that keep the verdicts meaningful.

The model is always namedEvery comment header carries the persona and the model that produced it, and both are stored with the review, so you can compare personas over time.
Dissent is surfaced, not averagedThe synthesis highlights findings only one persona made, and the verdict label takes the most cautious verdict.
Approvals without evidence are flaggedAn approval that needed a changelog or a CRD schema it did not have is marked contested, so a missing check cannot pass as a clean yes.
Once per commitEach persona reviews a given commit once. Re-reviews happen after a push or on explicit request, and replace the label.
Comment triggers are allowlistedOnly listed users can start a review by comment. Anyone else's /review is ignored.
It reviews, it does not mergeThe reviewer posts comments and a label. It never merges, and pushing fixes to your branch is off.

Where this stands.

Live
  • Independent second review of every bot MR, with xrev::LGTM / NC / DNM labels
In development
  • On-demand review by reviewer assignment or /review comment (built, not yet enabled in production)
  • Parallel personas with model-named headers and the synthesis comment
  • review:: verdict labels and contested-approval marking
  • Read-only repository tools for the reviewer
  • review <MR> from Slack
Roadmap
  • Label triggers such as reviewer:all
  • One GitLab user per persona, so each shows in the reviewers sidebar
  • Small fixes pushed to the branch by the default persona
← Previous storySlack commands