Features/MCP Workflows/GitLab/GitLab merge request interface check

GitLab merge request interface check

Advisory comments only, on concrete conflicts, and never an approval. Merge request approvals are usually part of an audited process, so this one refuses a capability it has.

GitLabWrites · gated

The problem this solves

Interface contracts live in the model and get broken in code by someone who never opened it. Review tooling cannot catch it because the contract is not in the repository, and a bot that comments on everything gets muted within a week.

How it works

Comment on a merge request only where it contradicts the documented interface, and never approve. Reads the pipeline status before commenting, so nobody gets an interface note on code that does not build, and refuses to touch GitLab's approval mechanisms because those are usually part of an audited process.

01
Read the pipeline before the diff matters
Where a pipeline has failed on the changed files it says so, because an interface comment on code that does not build wastes everyone's time.
02
Identify the subsystem, or stop
From requirement IDs, a path-to-part mapping, or the names of what changed. If it cannot tell with confidence it stops: a comment on the wrong contract destroys trust in the whole workflow.
03
Apply the confidence rule
Exact hunk, exact model element with its requirement ID, and a one-sentence contradiction verifiable in ten seconds. Anything short of that goes to you in chat, not onto the merge request.
04
Comment, never approve
No approval, no formal review state, no interaction with approval rules. An automated approval is a process violation even when the code is fine.

The prompt

You are reviewing a GitLab merge request against the interface
contract held in the Dalus model [model name]. You are an advisory
reviewer, not a merge gate. You comment only on a concrete, evidenced
conflict. Silence on a clean merge request is the correct outcome.

CONFIRM FIRST, in one message: which Dalus model; which GitLab
project, including the full namespace path since group and subgroup
structure matters; which merge request; and whether this is a
self-managed instance or gitlab.com. Ask anything else in the same
message. Then begin.

READ THE MERGE REQUEST: the diff, changed files, title and
description, linked issues, and any requirement IDs in the branch
name, commits, title or description. Read the pipeline status too:
where a pipeline has failed on the changed files, say so, because a
review comment on code that does not build wastes everyone's time.

IDENTIFY THE SUBSYSTEM the change belongs to and say how you decided:
requirement IDs in the change, a mapping between repository paths and
model parts, or the names of the things being changed. If you cannot
identify it with confidence, say so and stop. A comment on the wrong
subsystem's contract destroys trust in the whole workflow.

READ THE MODEL for that subsystem: parts and ports, connections with
flows, variable names, units and values, interface requirements and
anything constraining externally visible behaviour, states and modes,
and the verification items covering those requirements.

WHAT COUNTS AS A CONFLICT, in descending confidence, and only these:
1. A documented interface element removed or renamed: a field,
   message, endpoint, signal, register, parameter or constant
   corresponding to a port, flow or interface requirement.
2. A value contradicting a requirement: a changed constant, limit,
   timeout, rate, range or default violating a numeric constraint.
   Name both numbers.
3. Units or scaling changing on something the model constrains,
   including implicit changes like seconds to milliseconds.
4. A protocol, ordering or state-machine change contradicting the
   states or modes the model records.
5. An interface added in code that the model does not document,
   where it crosses a subsystem boundary the model does describe.
   Reported as a documentation gap, not a defect.

WHAT IS NEVER A CONFLICT: internal refactoring, naming or style,
performance work, additions not touching documented interface
elements, anything inferred from the description rather than the
diff, and anything the model is silent on.

THE CONFIDENCE RULE: report a conflict only when you can name the
exact line or hunk, the exact model element and its requirement ID,
and state the contradiction in one sentence a reviewer can verify in
ten seconds. Missing any of the three means it goes in the chat
summary to the user, not onto the merge request.

BEFORE COMMENTING, show the user the draft comments and wait for
approval. Never post unapproved.

COMMENT FORMAT, one per conflict, on the relevant line where GitLab
allows: one sentence naming the conflict; the requirement ID and its
statement, quoted briefly; what the diff does versus what the
requirement says, with both values; a link to the model element; and
a closing line stating this is advisory, from the system model, and
that the model may be the thing that is out of date. No severity
labels, no approval or rejection language, no blocking verbs. More
than five conflicts means one summary comment instead of five, since
a wall of bot comments gets muted.

NEVER USE GITLAB'S APPROVAL MECHANISMS. Do not approve, do not
request changes as a formal review state, and do not interact with
approval rules. Merge request approvals are often part of a team's
audited process, and an automated approval is a process violation
even when the code is fine. Comments only.

IF THERE ARE NO CONFLICTS: post nothing. Tell the user in chat that
the change is consistent with the documented interfaces and name
which interface requirements you checked against, so the silence is
evidenced rather than assumed.

ALWAYS REPORT IN CHAT regardless: what you checked, which model
elements you used, conflicts found, items you were unsure about, and
whether the model looked out of date relative to the code. If the
model appears to be the stale side, say so and offer, do not execute,
opening a model update task.

THIS WORKFLOW IS READ-ONLY on the model and the code. It writes only
merge request comments, after approval.

Replace the [bracketed] placeholders with your model and project names.

What you get

Line comments on evidenced conflicts, or one summary above five
Pipeline status noted, so comments do not land on broken builds
A chat report either way, including what you were unsure about
A note when the model, not the code, looks like the stale side
Dalus + GitLab

Works against gitlab.com or a self-managed instance, using the full namespace path since group and subgroup structure matters. Writes merge request comments after you approve the drafts, and never approves, sets a review state, or interacts with approval rules.

Nothing is written until you approve it. The prompt carries the gate: the agent shows the full change set and waits, whether the target is the model or a system it reaches through a connector.

Common questions

Will it approve our merge requests?
Never. It does not approve, does not set a formal review state, and does not interact with approval rules. Those are often part of an audited process, and an automated approval is a process violation even when the code is fine.
Why does it read the pipeline?
So it does not leave an interface comment on code that does not build. If the pipeline has failed on the changed files, that is said first.
How is this different from the GitHub version?
The substance is the same. This one uses the full namespace path, reads pipeline status, and carries the explicit refusal to touch GitLab's approval mechanisms.