<?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: Jan Duris</title>
    <description>The latest articles on DEV Community by Jan Duris (@dulvarn).</description>
    <link>https://dev.to/dulvarn</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4026392%2F70189d84-bdfe-4c8e-9fcc-85529ea976a2.png</url>
      <title>DEV Community: Jan Duris</title>
      <link>https://dev.to/dulvarn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dulvarn"/>
    <language>en</language>
    <item>
      <title>CI is green. Your release may still be risky.</title>
      <dc:creator>Jan Duris</dc:creator>
      <pubDate>Sun, 12 Jul 2026 20:15:10 +0000</pubDate>
      <link>https://dev.to/dulvarn/ci-is-green-your-release-may-still-be-risky-3c7m</link>
      <guid>https://dev.to/dulvarn/ci-is-green-your-release-may-still-be-risky-3c7m</guid>
      <description>&lt;p&gt;Every team has a moment like this: CI passes, the PR gets merged, the deploy goes out — and two hours later someone's asking why checkout is throwing 500s in production.&lt;/p&gt;

&lt;p&gt;Nobody skipped a step. The pipeline was green the whole time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The false comfort of green CI&lt;/strong&gt;&lt;br&gt;
Green CI feels like permission. It's a checkmark, it's fast, and it's automated — so it's easy to treat it as the final word on whether a release is safe. For a lot of teams, "tests passed" and "safe to ship" have quietly become the same sentence.&lt;/p&gt;

&lt;p&gt;They're not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What CI actually checks&lt;/strong&gt;&lt;br&gt;
Most CI pipelines are built to catch a specific, narrow slice of problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the code compile / build?&lt;/li&gt;
&lt;li&gt;Do unit tests pass?&lt;/li&gt;
&lt;li&gt;Does lint pass?&lt;/li&gt;
&lt;li&gt;Maybe: does a small integration suite pass?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's genuinely useful. It catches typos, broken imports, obvious logic errors, regressions in covered code paths. It's necessary.&lt;/p&gt;

&lt;p&gt;It's just not the same thing as "this release is safe to put in front of users."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What CI doesn't tell you&lt;/strong&gt;&lt;br&gt;
CI has no opinion on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Downstream dependencies&lt;/strong&gt; — does the third-party API you call still behave the way your integration test mocked it to?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manual steps&lt;/strong&gt; — did someone actually run the DB migration on staging before merging, or is that still "to do"?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deploy-time risk&lt;/strong&gt; — blue-green cutover, cache invalidation, feature flag state — none of that is exercised by a test suite that runs against a branch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Human process gaps&lt;/strong&gt; — did the person who approved this PR actually understand the blast radius, or did they approve because the CI badge was green?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this shows up as a failing check. It shows up as an incident.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Release risk is a different question than test pass/fail&lt;/strong&gt;&lt;br&gt;
"Did the tests pass" is a yes/no question about code. "Is this release safe to ship" is a probabilistic question about a system: what changed, how big is the diff, does it touch a critical path, is there a rollback plan, has this kind of change caused problems before.&lt;/p&gt;

&lt;p&gt;Most teams answer that second question with vibes — a Slack message, a shrug, "looks fine to me." That works fine until it doesn't, and by the time it doesn't, you're writing a postmortem instead of a checklist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What a release risk gate actually looks like&lt;/strong&gt;&lt;br&gt;
The teams that don't get burned by this usually have some version of the same thing, whether they call it that or not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A policy layer that blocks release on concrete conditions (required approvals, coverage thresholds, freeze windows) — not vibes, actual enforced rules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A signal aggregator that pulls test results, error rates, and coverage into one release health view instead of five open tabs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An audit trail — an immutable record of what was actually in a release, so when something breaks you're debugging from evidence, not memory.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this requires an enterprise platform. Small teams can build a lightweight version of this with GitHub Actions, a policy file, and some discipline. The point isn't the tooling — it's separating "code compiles" from "release is safe" as two distinct questions with two distinct answers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where to start if you don't have this yet&lt;/strong&gt;&lt;br&gt;
You don't need to build a whole release control system this week. Start smaller:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Write down the 3–5 things that, if skipped, have caused an incident before. Turn them into a checklist that's actually enforced, not just documented.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add one non-negotiable gate to your PR template — coverage on touched files, or a manual QA sign-off for anything touching payments/auth.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Capture a snapshot of what shipped in each release (commit list, who approved, what tests ran) so your next postmortem starts with facts instead of "let me check Slack."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want a starting point instead of building it from scratch, I put together a Release Checklist Pack and a GitHub QA Gates Pack — practical templates for exactly this, no platform lock-in required.&lt;/p&gt;

&lt;p&gt;I'm building Dulvarn, a release control system for GitHub-first teams, plus a set of standalone QA/release tools and templates. This post reflects my own experience shipping software, not any employer's views or confidential information.&lt;/p&gt;

</description>
      <category>qa</category>
      <category>devops</category>
      <category>testing</category>
      <category>github</category>
    </item>
  </channel>
</rss>
