<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Marcus Vinicius Tavares</title>
    <description>The latest articles on DEV Community by Marcus Vinicius Tavares (@mvtavares).</description>
    <link>https://dev.to/mvtavares</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1332418%2F156024b3-eebe-481d-9e5b-b0c881b664e6.png</url>
      <title>DEV Community: Marcus Vinicius Tavares</title>
      <link>https://dev.to/mvtavares</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mvtavares"/>
    <language>en</language>
    <item>
      <title>GitHub Required Checks Are Static. Your Pull Requests Aren't</title>
      <dc:creator>Marcus Vinicius Tavares</dc:creator>
      <pubDate>Sun, 29 Mar 2026 23:38:39 +0000</pubDate>
      <link>https://dev.to/mvtavares/github-required-checks-are-static-your-pull-requests-arent-8om</link>
      <guid>https://dev.to/mvtavares/github-required-checks-are-static-your-pull-requests-arent-8om</guid>
      <description>&lt;h1&gt;
  
  
  GitHub Required Checks Are Static. Your Pull Requests Aren't
&lt;/h1&gt;

&lt;p&gt;A docs-only pull request should not have to wait for backend builds, integration suites, and security scans that were never relevant to the change.&lt;/p&gt;

&lt;p&gt;But a lot of teams still live with exactly that.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because GitHub required checks are usually static, while pull requests are not.&lt;/p&gt;

&lt;p&gt;That mismatch creates a common set of bad options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;require everything and waste CI&lt;/li&gt;
&lt;li&gt;require less and weaken protection&lt;/li&gt;
&lt;li&gt;or fake conditional enforcement inside workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last pattern is especially common.&lt;/p&gt;

&lt;p&gt;Teams keep a workflow required for branch protection, then use path filters or changed-files logic so the jobs exit quickly when the change is irrelevant.&lt;/p&gt;

&lt;p&gt;That workaround is understandable.&lt;/p&gt;

&lt;p&gt;It is also a sign that workflow execution is carrying policy decisions it was never meant to own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The distinction that matters
&lt;/h2&gt;

&lt;p&gt;There are really two different questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Should this workflow run?&lt;/li&gt;
&lt;li&gt;Should this check be required for merge?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Path filtering helps with the first one.&lt;/p&gt;

&lt;p&gt;It does not answer the second one.&lt;/p&gt;

&lt;p&gt;That is why a scoped workflow like this is useful but incomplete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api/**"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;db/**"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auth/**"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is good execution logic. A backend workflow should not run for a docs-only change.&lt;/p&gt;

&lt;p&gt;But branch protection still needs to know whether backend checks were required for this pull request in the first place.&lt;/p&gt;

&lt;p&gt;That is the real gap.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Conditional execution is not the same as conditional merge requirements.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example, a docs-only PR may need only docs linting, while a PR touching &lt;code&gt;api/&lt;/code&gt;, &lt;code&gt;db/&lt;/code&gt;, and &lt;code&gt;auth/&lt;/code&gt; may need backend tests, integration checks, and stricter approvals.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a better model looks like
&lt;/h2&gt;

&lt;p&gt;The cleaner approach is to separate execution from policy.&lt;/p&gt;

&lt;p&gt;Let CI answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what ran&lt;/li&gt;
&lt;li&gt;what passed&lt;/li&gt;
&lt;li&gt;what failed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let policy answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what needed to run&lt;/li&gt;
&lt;li&gt;what approvals were required&lt;/li&gt;
&lt;li&gt;whether the pull request is merge-ready&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes pull request behavior much easier to reason about.&lt;/p&gt;

&lt;p&gt;A docs-only change can require lightweight checks.&lt;/p&gt;

&lt;p&gt;A pull request touching &lt;code&gt;api/&lt;/code&gt;, &lt;code&gt;db/&lt;/code&gt;, and &lt;code&gt;auth/&lt;/code&gt; can require heavier tests and stricter approvals.&lt;/p&gt;

&lt;p&gt;Same repo. Same protected branch. Different pull request. Different required checks.&lt;/p&gt;

&lt;p&gt;That should feel normal.&lt;/p&gt;

&lt;p&gt;Without a policy layer, teams usually end up in one of two bad states.&lt;/p&gt;

&lt;p&gt;Either they require everything and accept wasted CI, or they stop requiring checks they do not know how to model cleanly and accept weaker protection.&lt;/p&gt;

&lt;p&gt;Neither is a great long-term answer.&lt;/p&gt;

&lt;p&gt;The annoying middle ground is even more common: keep the workflow required, let it start on every PR, and add enough shell logic that it can pretend to be conditional.&lt;/p&gt;

&lt;p&gt;That works, but it also turns CI YAML into a place where merge policy quietly accumulates.&lt;/p&gt;

&lt;h2&gt;
  
  
  A concrete example
&lt;/h2&gt;

&lt;p&gt;Imagine two pull requests in the same repo.&lt;/p&gt;

&lt;p&gt;The first changes only &lt;code&gt;docs/&lt;/code&gt; and &lt;code&gt;README.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The second changes &lt;code&gt;api/&lt;/code&gt;, &lt;code&gt;db/&lt;/code&gt;, and &lt;code&gt;auth/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Those pull requests should not need the same merge requirements.&lt;/p&gt;

&lt;p&gt;The first might need docs linting and a quick approval path.&lt;/p&gt;

&lt;p&gt;The second might need backend tests, integration checks, and stricter review.&lt;/p&gt;

&lt;p&gt;Same branch. Same repository. Different pull request. Different required checks.&lt;/p&gt;

&lt;p&gt;That is the behavior teams usually want, even if GitHub’s native required-check model does not express it cleanly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one required policy status is simpler
&lt;/h2&gt;

&lt;p&gt;This is why the “single required MergeGuard status” model is appealing.&lt;/p&gt;

&lt;p&gt;Instead of forcing every possible workflow to show up on every pull request, GitHub can require one deterministic decision about what this pull request actually needs.&lt;/p&gt;

&lt;p&gt;MergeGuard evaluates PR context and decides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which checks matter&lt;/li&gt;
&lt;li&gt;which approvals matter&lt;/li&gt;
&lt;li&gt;whether merge is allowed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your workflows stay focused on execution. The policy layer handles merge logic.&lt;/p&gt;

&lt;p&gt;That can reduce wasted CI time, but it also improves the design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;less branch protection churn&lt;/li&gt;
&lt;li&gt;less policy logic buried in YAML&lt;/li&gt;
&lt;li&gt;clearer merge readiness&lt;/li&gt;
&lt;li&gt;stricter protection without forcing irrelevant workflows to run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also makes the pull request easier to explain.&lt;/p&gt;

&lt;p&gt;Instead of asking engineers to infer merge readiness from a changing set of workflow outcomes, you give GitHub one deterministic answer about whether this PR has satisfied the checks and approvals that matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Path filters and changed-files actions are still useful.&lt;/p&gt;

&lt;p&gt;They are just solving a narrower problem.&lt;/p&gt;

&lt;p&gt;They decide what runs. They do not decide what should be required for merge.&lt;/p&gt;

&lt;p&gt;If your team is fighting GitHub required-check rigidity, the missing piece is usually conditional merge policy, not more workflow tricks.&lt;/p&gt;

&lt;p&gt;We built &lt;a href="https://mergeguard.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch&amp;amp;utm_content=path-aware-checks-github" rel="noopener noreferrer"&gt;MergeGuard&lt;/a&gt; around exactly that gap: one deterministic status for context-aware checks, approvals, and merge readiness.&lt;/p&gt;

</description>
      <category>github</category>
      <category>devops</category>
      <category>cicd</category>
      <category>platformengineering</category>
    </item>
    <item>
      <title>AI Can Speed Up Code Review — but Merge Decisions Still Need Deterministic Guardrails</title>
      <dc:creator>Marcus Vinicius Tavares</dc:creator>
      <pubDate>Sun, 22 Mar 2026 22:03:17 +0000</pubDate>
      <link>https://dev.to/mvtavares/ai-can-speed-up-code-review-but-merge-decisions-still-need-deterministic-guardrails-2l85</link>
      <guid>https://dev.to/mvtavares/ai-can-speed-up-code-review-but-merge-decisions-still-need-deterministic-guardrails-2l85</guid>
      <description>&lt;h1&gt;
  
  
  AI Can Speed Up Code Review — but Merge Decisions Still Need Deterministic Guardrails
&lt;/h1&gt;

&lt;p&gt;AI is already useful in pull request workflows.&lt;/p&gt;

&lt;p&gt;It can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;summarize diffs&lt;/li&gt;
&lt;li&gt;explain code changes&lt;/li&gt;
&lt;li&gt;suggest fixes&lt;/li&gt;
&lt;li&gt;identify risky files&lt;/li&gt;
&lt;li&gt;draft reviewer context&lt;/li&gt;
&lt;li&gt;reduce reviewer fatigue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is real value.&lt;/p&gt;

&lt;p&gt;But there is a line teams should be careful not to cross:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI can accelerate review. It should not be the final authority on merge.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Use AI to help people review code faster.&lt;/p&gt;

&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt; let a probabilistic system be the thing that ultimately decides whether a pull request is allowed to merge.&lt;/p&gt;

&lt;p&gt;That final decision should come from deterministic policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Code review and merge governance are related, but they are not the same problem.&lt;/p&gt;

&lt;p&gt;Review is exploratory.&lt;/p&gt;

&lt;p&gt;Merge is enforcement.&lt;/p&gt;

&lt;p&gt;At merge time, the system is no longer asking, “What might be risky here?” It is asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the right people approve?&lt;/li&gt;
&lt;li&gt;Did the required checks pass?&lt;/li&gt;
&lt;li&gt;Does this change affect sensitive paths?&lt;/li&gt;
&lt;li&gt;Does it meet branch-specific rules?&lt;/li&gt;
&lt;li&gt;Are exception paths allowed for this case?&lt;/li&gt;
&lt;li&gt;Is it safe to merge right now?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those answers need to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consistent&lt;/li&gt;
&lt;li&gt;auditable&lt;/li&gt;
&lt;li&gt;predictable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is what deterministic means in practice.&lt;/p&gt;

&lt;p&gt;For the same inputs, the system should produce the same merge decision every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where GitHub helps — and where it stops
&lt;/h2&gt;

&lt;p&gt;GitHub gives teams solid primitives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;protected branches&lt;/li&gt;
&lt;li&gt;required reviews&lt;/li&gt;
&lt;li&gt;CODEOWNERS&lt;/li&gt;
&lt;li&gt;status checks&lt;/li&gt;
&lt;li&gt;auto-merge&lt;/li&gt;
&lt;li&gt;merge queue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those features matter. They are the starting point for safe repositories.&lt;/p&gt;

&lt;p&gt;But real governance gets more contextual as teams grow.&lt;/p&gt;

&lt;p&gt;A docs-only change should not necessarily be treated the same way as a change under &lt;code&gt;billing/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A small refactor in one area of the system should not necessarily be governed the same way as a pull request that changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;application code&lt;/li&gt;
&lt;li&gt;&lt;code&gt;infra/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;authentication config&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where static configuration starts to break down.&lt;/p&gt;

&lt;h2&gt;
  
  
  The “single approval” trap
&lt;/h2&gt;

&lt;p&gt;A common example is CODEOWNERS.&lt;/p&gt;

&lt;p&gt;Teams often assume that if multiple teams own a path, then all relevant stakeholders will need to approve changes touching that area.&lt;/p&gt;

&lt;p&gt;In practice, many setups end up enforcing something much weaker: one approval from one matching owner is enough.&lt;/p&gt;

&lt;p&gt;That can create a dangerous false sense of safety.&lt;/p&gt;

&lt;p&gt;A pull request can look fully approved in the UI even when only part of the actual review requirement was satisfied.&lt;/p&gt;

&lt;p&gt;That usually leads to a pile of compensating controls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;custom GitHub Actions&lt;/li&gt;
&lt;li&gt;reviewer-combination scripts&lt;/li&gt;
&lt;li&gt;Slack-based exception handling&lt;/li&gt;
&lt;li&gt;manual release-manager checks&lt;/li&gt;
&lt;li&gt;tribal knowledge about what “really” needs approval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not a policy system. That is policy scattered across tools and habits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams actually need
&lt;/h2&gt;

&lt;p&gt;Teams do not just need more repository settings.&lt;/p&gt;

&lt;p&gt;They need a merge policy layer.&lt;/p&gt;

&lt;p&gt;That policy layer should be able to express rules like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Changes under &lt;code&gt;infra/&lt;/code&gt; require platform approval&lt;/li&gt;
&lt;li&gt;Changes under &lt;code&gt;billing/&lt;/code&gt; require billing-owner approval&lt;/li&gt;
&lt;li&gt;Multi-domain changes require approval from each affected domain&lt;/li&gt;
&lt;li&gt;Docs-only changes can merge with lighter requirements&lt;/li&gt;
&lt;li&gt;Emergency hotfixes can take a controlled exception path&lt;/li&gt;
&lt;li&gt;A pull request merges only when the exact review and check requirements for &lt;em&gt;that change type&lt;/em&gt; are satisfied&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are normal requirements in real engineering organizations.&lt;/p&gt;

&lt;p&gt;They should be encoded and enforced, not left to luck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Governance as code is the scalable answer
&lt;/h2&gt;

&lt;p&gt;The scalable model is governance as code.&lt;/p&gt;

&lt;p&gt;Instead of spreading review logic across repository settings, scripts, and memory, define it from a structured source of truth.&lt;/p&gt;

&lt;p&gt;That source of truth can describe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ownership&lt;/li&gt;
&lt;li&gt;systems and domains&lt;/li&gt;
&lt;li&gt;required reviewers&lt;/li&gt;
&lt;li&gt;sensitivity levels&lt;/li&gt;
&lt;li&gt;exception paths&lt;/li&gt;
&lt;li&gt;environment-specific rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From there, merge enforcement becomes much more reliable.&lt;/p&gt;

&lt;p&gt;You can keep ownership definitions centralized, keep CODEOWNERS aligned automatically, validate exact approval requirements, and explain why a pull request was allowed or blocked.&lt;/p&gt;

&lt;p&gt;That is a much better fit for modern teams than static repository rules alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI fits
&lt;/h2&gt;

&lt;p&gt;AI fits well in the assistive layer.&lt;/p&gt;

&lt;p&gt;Use it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;summarize pull requests&lt;/li&gt;
&lt;li&gt;identify likely reviewers&lt;/li&gt;
&lt;li&gt;suggest missing tests&lt;/li&gt;
&lt;li&gt;explain unfamiliar code&lt;/li&gt;
&lt;li&gt;highlight unusual changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where probabilistic systems are strong.&lt;/p&gt;

&lt;p&gt;But merge is different.&lt;/p&gt;

&lt;p&gt;If an AI says, “this looks safe,” that may be useful input.&lt;/p&gt;

&lt;p&gt;It is not enforcement.&lt;/p&gt;

&lt;p&gt;Nobody would replace CI with “the model thinks the build is probably okay.”&lt;/p&gt;

&lt;p&gt;Merge governance deserves the same discipline.&lt;/p&gt;

&lt;h2&gt;
  
  
  A better operating model
&lt;/h2&gt;

&lt;p&gt;The right model is not human-only review.&lt;/p&gt;

&lt;p&gt;It is also not AI-only control.&lt;/p&gt;

&lt;p&gt;It is a layered system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;humans provide judgment&lt;/li&gt;
&lt;li&gt;AI provides acceleration&lt;/li&gt;
&lt;li&gt;deterministic policy provides enforcement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives teams speed without giving up trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where MergeGuard fits
&lt;/h2&gt;

&lt;p&gt;This is exactly the gap &lt;a href="https://mergeguard.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch&amp;amp;utm_content=ai-code-review-deterministic-merge-policy" rel="noopener noreferrer"&gt;MergeGuard&lt;/a&gt; is built to close.&lt;/p&gt;

&lt;p&gt;MergeGuard adds a deterministic policy layer to GitHub pull request workflows, so teams can enforce the review and approval logic they actually need.&lt;/p&gt;

&lt;p&gt;That means policy can reflect reality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which parts of the system changed&lt;/li&gt;
&lt;li&gt;who owns them&lt;/li&gt;
&lt;li&gt;which approval combinations are required&lt;/li&gt;
&lt;li&gt;which exceptions are allowed&lt;/li&gt;
&lt;li&gt;when a pull request is truly safe to merge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to replace GitHub’s controls.&lt;/p&gt;

&lt;p&gt;It is to extend them into something more context-aware and more trustworthy.&lt;/p&gt;

&lt;p&gt;That matters even more if your team is experimenting with AI-generated code, agent-created pull requests, or more aggressive automerge paths.&lt;/p&gt;

&lt;p&gt;The faster code moves, the more important deterministic enforcement becomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;AI should absolutely make pull request workflows faster.&lt;/p&gt;

&lt;p&gt;But merge is not just another productivity step.&lt;/p&gt;

&lt;p&gt;It is a governance decision.&lt;/p&gt;

&lt;p&gt;And governance works best when it is deterministic.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI should suggest and accelerate. Deterministic policy should decide and enforce.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your team wants deterministic merge policy for GitHub pull request workflows, learn more at &lt;a href="https://mergeguard.dev?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch&amp;amp;utm_content=ai-code-review-deterministic-merge-policy" rel="noopener noreferrer"&gt;mergeguard.dev&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>github</category>
      <category>devops</category>
      <category>codereview</category>
    </item>
  </channel>
</rss>
