<?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: Deployment Confidence</title>
    <description>The latest articles on DEV Community by Deployment Confidence (@deployconfidence).</description>
    <link>https://dev.to/deployconfidence</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%2F4057880%2F938b4350-f1d3-4e63-bf23-8d96476eb8bc.png</url>
      <title>DEV Community: Deployment Confidence</title>
      <link>https://dev.to/deployconfidence</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deployconfidence"/>
    <language>en</language>
    <item>
      <title>Release notes answer the wrong question</title>
      <dc:creator>Deployment Confidence</dc:creator>
      <pubDate>Sat, 01 Aug 2026 17:34:29 +0000</pubDate>
      <link>https://dev.to/deployconfidence/release-notes-answer-the-wrong-question-5afa</link>
      <guid>https://dev.to/deployconfidence/release-notes-answer-the-wrong-question-5afa</guid>
      <description>&lt;p&gt;Before every release, somebody generates the notes. It used to take twenty minutes of scrolling the commit log. Now a model does it in four seconds, and there are a dozen products that will do it for you.&lt;/p&gt;

&lt;p&gt;We got dramatically faster at producing a document nobody uses to decide anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two different artifacts
&lt;/h2&gt;

&lt;p&gt;Release notes are a &lt;strong&gt;communication&lt;/strong&gt; artifact. Past tense, written outward, for people who weren't in the room — users, support, the changelog page. "Added X. Fixed Y." Their job is to tell someone what already happened.&lt;/p&gt;

&lt;p&gt;The deploy decision needs a &lt;strong&gt;risk&lt;/strong&gt; artifact. Future tense, written inward, for the person about to press the button. Its job is to say what could go wrong and what to check first.&lt;/p&gt;

&lt;p&gt;Different tense, different reader, different content. We keep producing the first one and then making the second decision on vibes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put them side by side
&lt;/h2&gt;

&lt;p&gt;Here is a realistic release note:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Added dark mode&lt;/li&gt;
&lt;li&gt;Fixed login redirect&lt;/li&gt;
&lt;li&gt;Updated dependencies&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nothing in there is false. Nothing in there is what you need either.&lt;/p&gt;

&lt;p&gt;What's worth knowing is that the login redirect fix touched session handling — the same code path as authentication. That the dependency update was a lockfile bump underneath that same auth code. That the two arrived together, in a PR one person approved at 18:00 on a Thursday.&lt;/p&gt;

&lt;p&gt;The release note summarises &lt;strong&gt;what&lt;/strong&gt;. The decision needs &lt;strong&gt;where&lt;/strong&gt;, &lt;strong&gt;together with what&lt;/strong&gt;, and &lt;strong&gt;reviewed how carefully&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI made this worse rather than better
&lt;/h2&gt;

&lt;p&gt;Summarising a diff is a solved problem. It's among the easiest things a language model does: the input is structured, the output is a list, and the failure mode is boring rather than dangerous. That's exactly why the category is crowded.&lt;/p&gt;

&lt;p&gt;Deciding whether a set of changes is safe to ship is not that. It requires knowing which paths are load-bearing, what changed &lt;em&gt;together&lt;/em&gt;, what the review actually said, and what the CI state means. Almost none of that lives in the diff text. It lives in the pull requests, the review states, the check runs, and the file paths.&lt;/p&gt;

&lt;p&gt;So we automated the easy half and called the job done. The document got faster. The decision didn't move at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tell
&lt;/h2&gt;

&lt;p&gt;Ask anyone on your team what they read before approving a deploy.&lt;/p&gt;

&lt;p&gt;Nobody says "the release notes." They say they skim the compare view — which is another way of saying that the artifact we generate is not the artifact we use.&lt;/p&gt;

&lt;p&gt;A document produced for every release and consulted for none of them isn't a documentation problem. It's a signal that the real work is happening somewhere with no tooling at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep writing them anyway
&lt;/h2&gt;

&lt;p&gt;None of this makes release notes useless. They're good at their actual job: users need to know what changed, support needs to know what to expect, and the changelog is a real product surface.&lt;/p&gt;

&lt;p&gt;Just stop expecting them to answer a question they were never shaped to answer. Ship the notes to your users. Build something else for the person holding the deploy button.&lt;/p&gt;




&lt;p&gt;What do you actually read before approving a deploy? I'm collecting answers, and so far "the compare view, quickly" is winning by a lot.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ci</category>
      <category>testing</category>
      <category>programming</category>
    </item>
    <item>
      <title>Green CI is not a deploy decision</title>
      <dc:creator>Deployment Confidence</dc:creator>
      <pubDate>Sat, 01 Aug 2026 11:44:47 +0000</pubDate>
      <link>https://dev.to/deployconfidence/green-ci-is-not-a-deploy-decision-53lc</link>
      <guid>https://dev.to/deployconfidence/green-ci-is-not-a-deploy-decision-53lc</guid>
      <description>&lt;p&gt;It's 17:40 on a Thursday. Sixty-one commits have landed since the last tag. CI is green. Someone in the release channel types: "are we good to ship?"&lt;/p&gt;

&lt;p&gt;And then a strange thing happens. Nobody actually knows.&lt;/p&gt;

&lt;p&gt;The person who asked doesn't know — they can't read sixty-one commits. The tech lead skims the compare view, sees nothing on fire, and says "should be fine." The QA engineer asks what changed and gets a link to a diff. Somebody ships it.&lt;/p&gt;

&lt;p&gt;Most of the time it works. That's the problem. It works often enough that we never notice we replaced a decision with a mood.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottleneck moved and nobody moved with it
&lt;/h2&gt;

&lt;p&gt;For fifteen years the constraint on shipping software was writing it. Everything we built — CI, code review, trunk-based development, feature flags — was designed around that constraint.&lt;/p&gt;

&lt;p&gt;That constraint is gone. In 2025 and 2026, a mid-sized team generates more code in a week than it used to generate in a month.&lt;/p&gt;

&lt;p&gt;The 2025 DORA report caught the consequence precisely: teams that increased AI adoption reported better code quality and better documentation at the individual level — and &lt;em&gt;worse delivery stability at the team level&lt;/em&gt;. Change failure rate went up. Rework went up. Individual output improved while the system got less reliable.&lt;/p&gt;

&lt;p&gt;That is not a paradox. It's a queue. Code generation got 5x faster. Review, judgement and release verification did not get faster at all. The volume now outruns the only part of the pipeline that was never automated: someone deciding whether this particular set of changes is safe to put in front of users.&lt;/p&gt;

&lt;p&gt;And the benchmarks say we were not good at it &lt;em&gt;before&lt;/em&gt; the volume went up. Only about 8.5% of teams achieve the ideal 0–2% change failure rate. Elite performers sit around 5%. Low performers run at 45–60% — meaning nearly one in two of their deploys causes a degradation that needs a fix.&lt;/p&gt;

&lt;p&gt;Half. Of deploys.&lt;/p&gt;

&lt;h2&gt;
  
  
  What CI actually tells you
&lt;/h2&gt;

&lt;p&gt;Green CI means: the code you wrote does what you told it to do, on the tests you remembered to write, in an environment that is not production.&lt;/p&gt;

&lt;p&gt;That's valuable. It is also a much smaller claim than the one we use it for.&lt;/p&gt;

&lt;p&gt;CI does not know that this release contains a database migration &lt;em&gt;and&lt;/em&gt; code that still reads the old column. It does not know that auth and payments changed in the same window, which is the pairing behind a disproportionate share of the worst outages. It does not know that one of these PRs was merged with an unresolved "changes requested" review. It does not know that 140 production files changed and not one test file was touched.&lt;/p&gt;

&lt;p&gt;Every one of those is visible in the repository. None of them is visible in a green checkmark. We just never built the thing that looks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four questions
&lt;/h2&gt;

&lt;p&gt;Strip away the tooling and every deploy decision is an attempt to answer four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What actually changed?&lt;/strong&gt; Not the commit messages — a real answer, inferred from which code paths moved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is any of it risky?&lt;/strong&gt; Which specific changes carry a blast radius, and how big.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What should we test before we ship?&lt;/strong&gt; Tied to this release, not a generic regression suite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can we deploy, yes or no?&lt;/strong&gt; And if not, what has to be true first.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notice that release notes answer none of these. Release notes are a communication artifact — a list of what happened, written for people who weren't there. They are not a risk artifact. Generating them with AI makes you faster at producing the wrong document.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rubric, if you want to do this by hand
&lt;/h2&gt;

&lt;p&gt;You don't need a tool to start. Here is the signal list I'd use, and — more importantly — why each one earns its place. Steal it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schema migrations.&lt;/strong&gt; The highest-severity routine change in most codebases, because it's the one you cannot roll back by redeploying. Weight it heaviest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payment and billing paths.&lt;/strong&gt; Failures here are the only bugs that are simultaneously a customer incident, a finance incident, and sometimes a compliance incident.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auth, session, token, RBAC.&lt;/strong&gt; Same reasoning. A subtle auth regression is worse than an outage: an outage announces itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Declared breaking changes.&lt;/strong&gt; A &lt;code&gt;!&lt;/code&gt; in a conventional commit, a &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; footer, a &lt;code&gt;breaking&lt;/code&gt; label. Someone already told you. Read it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PRs merged over an unresolved "changes requested."&lt;/strong&gt; This is the highest-value signal on the list and almost nobody checks it. A reviewer looked at the code, said no, and it shipped anyway. That's not a code smell, it's a process breakdown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Release size.&lt;/strong&gt; Not because big releases are inherently bad, but because they destroy your ability to bisect. When something breaks in a 200-commit release, your mean time to recovery is a function of how long it takes to find which commit did it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production files changed, zero test files touched.&lt;/strong&gt; Not a moral failing — sometimes correct. But it should be a &lt;em&gt;choice&lt;/em&gt; someone made, not a fact nobody noticed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No pull requests traceable at all.&lt;/strong&gt; If a range of commits has no PRs behind it, nothing in this list applies, because nothing was reviewed. That's the finding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infra, CI config, &lt;code&gt;.env&lt;/code&gt;, lockfiles.&lt;/strong&gt; Lower individually. Dangerous in combination with anything above, because they change the ground the release stands on.&lt;/p&gt;

&lt;p&gt;Run a release through that list by hand once. It takes about ten minutes and I promise you find something.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I got wrong twice
&lt;/h2&gt;

&lt;p&gt;I built a scoring engine on top of that rubric — every release starts at 100, rules subtract. Two design decisions took me three attempts each, and I think they generalise to any risk score anyone reading this ever builds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Penalties have to compound, not add.&lt;/strong&gt; My first version subtracted flat points: migration −18, auth −14, no tests −10, and so on. Any real release of decent size hit zero. Which means a messy-but-shippable Tuesday release and an actual disaster both scored 0 — the score lost all resolution exactly where you need it most. Now each penalty removes a share of the confidence &lt;em&gt;still remaining&lt;/em&gt;. A bad release approaches zero asymptotically and never quite gets there, so "bad" and "catastrophic" stay distinguishable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Positive signals must be worth exactly zero points.&lt;/strong&gt; This one is counterintuitive and I resisted it. Green CI, approvals, tests shipped — surely those should add? No. If good signals add points, a clean release banks headroom above 100, and then adding a database migration to it leaves the score at 100. The score would silently absorb the risk. A user seeing that reads it as a bug, and they're right. The absence of a problem is not evidence of safety. It's just the absence of a problem.&lt;/p&gt;

&lt;p&gt;That second one is really a statement about risk scoring in general: &lt;strong&gt;you cannot earn credit against future harm.&lt;/strong&gt; Every dashboard that lets a green metric offset a red one is lying to somebody.&lt;/p&gt;




&lt;p&gt;The engine described above is what we're building here — point it at two refs of a repo, it reads the PRs, commits, changed files and CI checks between them, scores the release, and gives you a QA checklist for what it actually touched. It isn't open to sign-ups yet; right now it's being calibrated against real releases of large open-source projects, which is its own article.&lt;/p&gt;

&lt;p&gt;If your CI is green and you still hesitate before hitting deploy, that hesitation is information. It's worth building the thing that explains it.&lt;/p&gt;

&lt;p&gt;What's on your deploy checklist that isn't on mine? I'm genuinely collecting these — the rubric above is version four and it got better every time someone told me what I was missing.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ci</category>
      <category>testing</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
