Reviewing an AI-Generated Architecture Change Like a Pull Request
Somewhere in the last decade, most engineering organizations agreed on a norm: nobody merges code they haven't read, no matter how trivial the change looks or how much they trust the author. That norm exists because trust is not a substitute for verification, and because the cost of checking is small compared to the cost of a bad change reaching production. Architecture is now arriving at the same fork in the road, for the same reason. When an AI assistant proposes a change to your architecture model, you are being handed something that looks a lot like a pull request — a bounded, described, inspectable set of edits, waiting for a human to either approve or reject it. The question is whether you're going to review it like one.
This matters more for architecture than it might first appear, because the failure mode is quieter than a broken build. A bad code change usually announces itself: tests fail, the app crashes, a user reports an error. A bad architecture change often doesn't announce itself at all. It sits in the model, technically valid, passing every automated check, and it's wrong in a way that only becomes visible six months later when someone tries to retire a system and discovers a dependency that was drawn incorrectly, or a security boundary that got quietly redrawn in the AI's favor because the description sounded reasonable and nobody looked closely at what the operations actually did.
The parallel, and where it holds
In Mooodels, an AI-proposed architecture change doesn't touch the model directly. It arrives as a ModelPatch — a structured, itemized list of operations: add this element, rename that one, connect these two, remove that relationship — bundled with a plain-language description of what it does and why. Before a human ever sees it, the patch has already been run through schema validation, checked against the metamodel, and evaluated against whatever deterministic architecture rules apply. None of that makes the patch correct. It makes the patch well-formed and rule-compliant, which is a real and useful guarantee, but it is not the same guarantee as "this is the right change." A pull request that compiles, passes lint, and passes CI can still implement the wrong feature, misunderstand the ticket, or introduce a subtle logic error that no automated check was written to catch. The same is true of a ModelPatch that passes every deterministic gate and still gets the architecture wrong.
That's the core of the parallel, and it's worth being precise about it rather than waving at it. A pull request review and a ModelPatch review are doing structurally the same job:
| Code review | ModelPatch review |
|---|---|
| Does the diff match the PR description / ticket? | Do the operations match the plain-language description? |
| Do the changed files make sense given the codebase you know? | Do the changed relationships make sense given the system you know? |
| Did CI / lint / static analysis flag anything? | Did an architecture rule flag a violation? |
| What else depends on the changed code? (call graph, tests) | What views and downstream elements does impact analysis say this touches? |
| Is this PR unusually large for what it claims to do? | Does this patch touch more elements than its description implies? |
Where the parallel breaks down is instructive too. A pull request is reviewed by someone who can, in principle, run the code, step through a debugger, or write a test that proves the bug exists. An architecture model doesn't execute. There's no runtime to catch the mistake for you a week later when a test suite goes red. The only correctness signal you get is the one you generate yourself, by reading the patch carefully and knowing the system it describes. That absence of a safety net downstream is exactly why the review has to be more careful, not less, than the code equivalent — there is no CI pipeline standing behind you if you wave something through that shouldn't have gone through.
What a patch actually looks like
Before getting into how to review one well, it helps to see what's actually on the screen. A ModelPatch preview in Mooodels renders as a short, readable summary of the operations, not as raw JSON — though the operations themselves are structured underneath it. A typical one, proposed after asking an assistant to "route external permit lookups through a gateway instead of calling the permit API directly," might render like this:
Proposed change: Introduce API Gateway in front of PermitAPI
Added element: API Gateway (Application Component)
Connected: Portal -> API Gateway (uses)
Connected: API Gateway -> PermitAPI (uses)
Removed: Portal -> PermitAPI (uses)
Rule checks: 3 passed, 0 violations
Impact: 2 views affected ("External Integration Landscape",
"Security Boundary Overview"); 1 downstream element
(PermitAPI) now has an indirect dependent path via API Gateway
This is the material a reviewer actually has to work with: a description, a short list of adds/connects/disconnects, a rule-check result, and an impact summary. It's deliberately compact — the same way a good PR description and a scoped diff are more reviewable than a thousand-line changeset with no summary. But compactness cuts both ways. A four-line patch is fast to approve, and fast-to-approve is exactly the condition under which careless approval happens.

What to actually look at
Rubber-stamping a ModelPatch usually looks like reading the one-line description, nodding, and clicking approve. Reviewing it properly means checking four separate things, none of which are covered by the fact that the patch passed validation.
1. Does the description match what the operations actually do
This is the single highest-value check, and it's the one people skip first when they're busy. The description is generated to be readable, which means it's also capable of being plausible and wrong — summarizing five operations accurately in spirit while quietly omitting or mischaracterizing one of them. "Introduce an API Gateway in front of PermitAPI" is an accurate summary of the four operations above. But imagine the same description sitting on top of a patch that also silently disconnects a monitoring relationship, or renames an unrelated element as a side effect of resolving a naming collision. The description would still read as reasonable. The only way to catch that is to read the operation list itself, not just the sentence above it — the same discipline as reading the diff instead of trusting the PR title.
Concretely: count the operations. If the description mentions one addition and one connection but the patch contains four operations, the other two need an explicit reason before you approve, not an assumption that they're incidental.
2. Do the affected relationships make sense given what you know about the system
This is where domain knowledge does work that no automated check can do. A rule engine can confirm that a relationship is structurally valid — that an Application Component is allowed to "use" another Application Component, that the relationship doesn't violate a layering rule you've defined. It cannot confirm that the relationship reflects reality. If you know that PermitAPI is called by three other consumers besides the Portal, and the patch only rewires the Portal's relationship, that's worth noticing — is the gateway meant to be introduced everywhere eventually, and this is a first step, or did the AI only see the part of the model it was asked about and miss the other callers? Neither answer is wrong, but only a reviewer who knows the system can tell the difference between "intentionally scoped" and "incompletely reasoned."
This is the same judgment call a senior engineer makes reading a PR that only updates one of three call sites that clearly needed the same fix. Nothing about the diff is invalid. It's the reviewer's system knowledge, not the tool's, that catches the gap.
3. Did any architecture rule flag a violation
Deterministic rules run automatically against every proposed change, AI-proposed or not — a rule like "public-facing applications must route through an approved gateway" or "Tier-1 systems must have a named owner" gets evaluated the same way regardless of who or what authored the patch. A clean rule-check result is worth having, and it's worth trusting for what it actually checks. It is not worth reading as "this change is architecturally sound," because rules only catch what someone thought to encode as a rule. A rule set that checks ownership and gateway routing says nothing about whether a new dependency creates an undesirable coupling between two domains that were deliberately kept separate for organizational reasons nobody wrote down as a formal constraint. Zero violations means zero known violations. Treat a clean rule-check the way you'd treat a green CI run on a PR that touches a code path with no test coverage: reassuring, not conclusive.
4. What views and downstream elements does impact analysis say this touches
This is the closest architecture equivalent to "what does the call graph say depends on this function," and it's the check most likely to surface a consequence the AI itself didn't flag in its description. A patch that reads as a small, local change — swap one relationship for two — can still turn out to affect a security boundary view or a compliance-relevant diagram that nobody mentioned, simply because the element it touched happens to sit inside that view's scope. Impact analysis exists precisely so this isn't left to memory. If the patch above shows it affects a "Security Boundary Overview" view, that's a specific, concrete prompt to go look at that view before approving — not to approve first and notice the surprise later when someone else opens that view and asks why it changed.
Reviewer fatigue: the failure mode that looks like success
Every engineering team that adopted mandatory code review eventually discovered the same problem, and it wasn't that reviewers were careless people. It was that careful review is expensive to sustain, and the twentieth PR of the week from a colleague whose last nineteen PRs were all fine gets a different quality of attention than the first one did. The reviewer isn't being lazy in any blameworthy sense — they're pattern-matching, because pattern-matching is what human attention does under repeated, similar-looking load. The nineteen good patches trained the reviewer, correctly, that this author's changes are usually fine. That training is exactly what makes the twentieth patch dangerous, because "usually fine" quietly becomes "probably fine" becomes "I'll skim it," and none of those transitions announce themselves.
Architecture review with an AI assistant hits this faster and harder than code review does, for a specific reason: the assistant doesn't have good days and bad days the way a human colleague does, and its patches tend to be uniformly well-formed, because they've already passed schema and metamodel validation before a human ever sees them. There's no scruffy commit history, no obviously rushed change, no tired-Friday-afternoon PR that puts a reviewer on alert. Every patch looks like the reviewer's best colleague's best work: clean, well-described, passing every automated gate. That uniformity is exactly what erodes vigilance fastest. A human author's variability keeps a reviewer's guard up, inconsistently but somewhat. A consistently well-formed AI patch removes that signal entirely, and what's left filling the gap is habit — approve, approve, approve, because the last fifteen were fine and this one looks like them.
The dangerous patch, when it comes, usually doesn't look dangerous. It looks exactly like the nineteen before it: plausible description, clean rule check, a handful of operations that seem locally reasonable. The thing that's wrong with it is something that requires actually reading it to see — a relationship that got pointed the wrong direction, a rename that collided with an existing element in a way the rule engine didn't have a rule for, an impact-analysis result showing four affected views when the description implied one. None of that is visible from the outside of the patch. It's only visible to a reviewer who is still reading at review twenty the way they read at review one.
The failure isn't that reviewers stop being competent. It's that competence and attention quietly decouple, and nothing in the interface tells you when that's happened.
A concrete habit that actually counters it
Knowing that fatigue is the mechanism doesn't fix it by itself — "pay more attention" is not a policy, it's a wish. What works, in code review and equally in model review, is replacing vigilance-as-willpower with a small number of mechanical habits that don't degrade with repetition, because they don't depend on staying alert. Three are worth adopting specifically for ModelPatch review.
Spot-check specific fields, not the whole description
Skimming a description end to end is where fatigue does its damage, because skimming is exactly the mode that degrades fastest under repetition — attention thins evenly across the whole thing, and it's precisely the parts that thin out that hide the problem. A more durable habit is to pick one or two specific, checkable facts in every patch and verify those deliberately, every time, regardless of how confident you feel: does the element count in the patch match the element count implied by the description? Does every "connect" operation have a plausible reverse-direction reason — i.e., does it make sense that A now depends on B, not just that a relationship exists between them? Is there a disconnect operation anywhere in the patch that the description doesn't mention at all? These are cheap, specific, binary checks. They take seconds. Crucially, because they're specific rather than "read the whole thing carefully," they don't get worse when you're tired or rushed the way general vigilance does — you're either checking the field or you're not.
Treat larger patches as needing closer review by default, not by judgment call
A four-operation patch and a forty-operation patch should not get the same review effort, and they should not get it by the reviewer's in-the-moment judgment about how busy they are — that judgment is exactly the thing fatigue corrodes. Set a concrete threshold: a patch touching more than, say, six or eight elements automatically gets flagged for slower review — read every operation individually, check impact analysis in full rather than skimming the summary line, and if the change is complex enough, ask the assistant to break it into smaller, independently reviewable patches rather than approving one large one because breaking it apart feels like more work in the moment. The exact number matters less than having one at all. A fixed threshold moves the decision about how much scrutiny a patch deserves out of the moment of reviewing it, where fatigue has the most influence, and into a standing rule that applies whether the reviewer is fresh or on their fifteenth review of the afternoon.
Periodically audit a sample of already-approved AI changes
Some engineering teams periodically re-review a sample of old merged pull requests — not because they expect to find something every time, but because the practice itself is a check on whether review quality has been holding up, and it occasionally does catch something that would otherwise sit undiscovered indefinitely. The same practice applies directly to approved ModelPatches. Once a month, or once a quarter, pull a handful of already-committed AI-proposed changes — ideally chosen at random rather than the ones you remember, since the ones you remember are disproportionately the ones that felt significant at the time — and review them again with fresh eyes, using the same four checks from the previous section, as though they'd just landed. This catches two different things: patches that were approved too quickly the first time, and slower drift, where each individual patch looked reasonable on its own but the cumulative effect of several of them moved the architecture somewhere nobody would have approved in one step. Semantic diff and impact analysis make this cheap to do, because re-examining what a past patch actually changed and what it currently affects doesn't require reconstructing the model's history from memory — it's a query, the same one available at review time.
None of these three habits requires trusting the AI less than you currently do, and none of them requires distrusting it more than you'd distrust a human colleague whose PRs you review. They exist because trust and vigilance are different things, and the entire point of reviewer fatigue as a failure mode is that vigilance quietly erodes while trust — reasonably — stays intact. The habits are there to keep the review honest even after the trust has become, correctly, a background assumption rather than something actively re-earned on every patch.
What this isn't
It's worth being clear about what disciplined review is not, because the alternative failure mode — reviewing so slowly and suspiciously that AI assistance stops being useful — is a real cost too, just a less quiet one. The goal isn't to distrust every patch as a matter of principle, re-deriving the entire architecture from first principles before approving anything. Deterministic rule checks and impact analysis exist precisely so a reviewer doesn't have to manually re-verify things a machine can check exhaustively and instantly — a clean rule-check result is real evidence, not a compliance formality to be second-guessed. The point of the four checks and three habits above is narrower and more useful than blanket suspicion: know specifically what the automated gates already covered, and spend human judgment on the part they structurally cannot cover — whether the change is actually right for a system only a person fully understands, described accurately, and free of a mismatch between what it says it does and what it actually does.
Why this is worth building the habit now
Code review culture didn't arrive because someone theorized it was a good idea in the abstract. It arrived because enough teams got burned by unreviewed changes reaching production, and the practice hardened into a norm precisely because the cost of skipping it turned out to be higher than the cost of doing it. Architecture review of AI-proposed changes is at the point code review was before that norm fully set — genuinely useful automated gates exist, a structured, readable diff exists, and a human is nominally in the loop, but the discipline of actually reading what's in front of you, rather than trusting that the gates already did the work, is still a habit each team has to build for itself rather than one the tooling can fully enforce from outside.
Mooodels can put a well-formed, rule-checked, impact-analyzed ModelPatch in front of a reviewer. It can make the description accurate to the operations, make the affected views visible before approval, and make a rejected patch cheap to send back for revision rather than something the reviewer has to manually undo. What it cannot do, by design, is decide that a change is right on the reviewer's behalf — that decision is deliberately kept a human one, patch by patch, for the same reason a merge button is a human decision and not something CI is trusted to press on its own. The tooling can make review fast and well-informed. Whether it stays a review, rather than sliding into a formality performed on the way to an already-decided yes, is a discipline the team on the other side of the approve button has to keep supplying — the twentieth time exactly as much as the first.
See the model this article describes, working in a real editor.
Try the live demo