<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Progressive-Delivery on Coffee or Blog</title>
    <link>/tags/progressive-delivery/</link>
    <description>Recent content in Progressive-Delivery on Coffee or Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Mon, 17 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="/tags/progressive-delivery/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Release Discipline in the Age of AI-Accelerated Development</title>
      <link>/posts/release-discipline-in-the-age-of-ai-accelerated-development/</link>
      <pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate>
      
      <guid>/posts/release-discipline-in-the-age-of-ai-accelerated-development/</guid>
      <description>Photo by Patrick Konior on Unsplash
A maturity model for shipping fast without breaking customer trust.
I made an earlier argument that deploying code and releasing a feature are not the same event, and that treating them as one causes unnecessary risk. That argument still holds. But the environment it was written for has changed.
AI-assisted development has made writing and shipping code dramatically cheaper. A change that used to take a sprint now takes an afternoon.</description>
      <content>&lt;p&gt;&lt;img alt=&#34;Control room overview&#34; src=&#34;/images/decoupling-deployment/hero-control-room.jpg&#34;&gt;
&lt;em&gt;Photo by &lt;a href=&#34;https://unsplash.com/@patrickkonior&#34;&gt;Patrick Konior&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/photos/a-view-of-a-control-room-from-above-FwHJ6mJjVd4&#34;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A maturity model for shipping fast without breaking customer trust.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I made &lt;a href=&#34;/posts/decoupling-deployment-from-release/&#34;&gt;an earlier argument&lt;/a&gt; that deploying code and releasing a feature are not the same event, and that treating them as one causes unnecessary risk. That argument still holds. But the environment it was written for has changed.&lt;/p&gt;
&lt;p&gt;AI-assisted development has made &lt;em&gt;writing&lt;/em&gt; and &lt;em&gt;shipping&lt;/em&gt; code dramatically cheaper. A change that used to take a sprint now takes an afternoon. That&amp;rsquo;s a genuine gain, but it doesn&amp;rsquo;t automatically make the &lt;em&gt;judgment&lt;/em&gt; around releasing that change any faster or better. When the cost of producing change drops and the discipline around exposing change doesn&amp;rsquo;t rise to match it, the result is exactly what customers are describing: things move, break, or reappear differently, without warning, more often than they can absorb.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here&amp;rsquo;s the core claim: in 2026, the bottleneck in software delivery is not how fast we can write code. It&amp;rsquo;s how deliberately we control who sees a change, when, and with what warning. AI removes the first constraint. It makes the second one more important, not less.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t a call to slow engineering down. It&amp;rsquo;s a call to stop routing all of that new speed straight at the customer, unfiltered.&lt;/p&gt;
&lt;h2 id=&#34;the-symptom-were-solving-for&#34;&gt;The symptom we&amp;rsquo;re solving for&lt;/h2&gt;
&lt;p&gt;Customers aren&amp;rsquo;t complaining that we ship too much. They&amp;rsquo;re complaining about three specific things, and it&amp;rsquo;s worth being precise because each has a different fix:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Rate of change&lt;/strong&gt; — things they learned last month look or behave differently now, with no signal it was coming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forced change&lt;/strong&gt; — a workflow they depend on changed or disappeared, and they had no way to stay on the old behavior while they adjusted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unpredictability&lt;/strong&gt; — they can&amp;rsquo;t tell the difference between &amp;ldquo;this is a bug&amp;rdquo; and &amp;ldquo;this is intentional,&amp;rdquo; because both arrive the same way: silently.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;None of these are solved by shipping less. All three are solved by &lt;strong&gt;separating four things we currently bundle into one event&lt;/strong&gt;: code lands in production, a feature becomes visible, a customer is told about it, and an old behavior is retired. Each deserves its own timeline, its own owner, and its own decision.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Deployment vs. Release Timeline diagram&#34; src=&#34;/images/decoupling-deployment/deployment-vs-release-timeline.svg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;the-four-question-test-for-every-user-visible-change&#34;&gt;The four-question test for every user-visible change&lt;/h2&gt;
&lt;p&gt;Before a change reaches a real customer, someone should be able to answer:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer determines&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Is it visible?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Whether it needs a flag at all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Is it disruptive?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Whether it needs staged rollout or can go straight to 100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Is it reversible?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Whether we need a dual code path, or a simple toggle is enough&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Does it remove something?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Whether it needs a deprecation notice and a minimum notice period&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A change that&amp;rsquo;s invisible (backend refactor, performance work) skips all of this, deploy it and move on. Everything else routes through the toolkit below. The mistake teams make under AI-accelerated velocity is treating &lt;em&gt;all&lt;/em&gt; changes like the first category because the code was cheap to produce.&lt;/p&gt;
&lt;h2 id=&#34;blast-radius-classification&#34;&gt;Blast-radius classification&lt;/h2&gt;
&lt;p&gt;Use this before merge, not after a customer complains. It should take seconds, not a meeting.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Rollout pattern&lt;/th&gt;
&lt;th&gt;Notice required&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Invisible&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Refactor, perf work, dependency bump&lt;/td&gt;
&lt;td&gt;Deploy directly&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Visible, additive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;New optional feature, new button&lt;/td&gt;
&lt;td&gt;Flag → rings → GA&lt;/td&gt;
&lt;td&gt;Changelog entry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Visible, behavioral&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Changed default, changed workflow&lt;/td&gt;
&lt;td&gt;Flag → opt-in beta → staged % → GA&lt;/td&gt;
&lt;td&gt;Advance in-app notice + changelog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Disruptive / breaking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Removed capability, forced migration&lt;/td&gt;
&lt;td&gt;Dual path, minimum notice window, opt-out during transition&lt;/td&gt;
&lt;td&gt;Direct communication, not just changelog&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img alt=&#34;Blast-Radius Classification diagram&#34; src=&#34;/images/release-discipline/blast-radius-classification.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;The AI-specific risk is that classes 2–4 get produced at the same velocity as class 1, and without this checkpoint they get &lt;em&gt;shipped&lt;/em&gt; at that velocity too. The checkpoint is cheap. Skipping it is what customers are feeling.&lt;/p&gt;
&lt;h2 id=&#34;the-toolkit&#34;&gt;The toolkit&lt;/h2&gt;
&lt;h3 id=&#34;1-feature-flags-but-with-a-lifecycle-not-just-an-onoff-switch&#34;&gt;1. Feature flags, but with a lifecycle, not just an on/off switch&lt;/h3&gt;
&lt;p&gt;Flags fail long-term not because teams don&amp;rsquo;t use them, but because nobody owns their &lt;em&gt;end state&lt;/em&gt;. A flag that&amp;rsquo;s still in the codebase eighteen months after full rollout is a liability, not a safety net. Every flag needs a stated life stage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rollout flag (temporary, by default):&lt;/strong&gt; exists to ramp a change safely. Has an owner and an expected removal date at creation time. Options at end of life:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Graduate&lt;/strong&gt; — feature is fully rolled out and stable → flag is deleted, new behavior becomes the only behavior.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Revert&lt;/strong&gt; — didn&amp;rsquo;t work → old path stays, new path is removed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extend deliberately&lt;/strong&gt; — a real reason exists to keep ramping slowly (enterprise contracts, regulatory cohorts) → re-approve with a new date, don&amp;rsquo;t let it drift by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational flag (long-lived, by design):&lt;/strong&gt; kill switches, ops-only toggles. These are allowed to live indefinitely, but should be inventoried separately from rollout flags so the two don&amp;rsquo;t get confused in review.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Permission / entitlement flag:&lt;/strong&gt; controls who gets a capability (plan tier, beta cohort, region). Long-lived by design, owned by product.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;Flag Lifecycle diagram&#34; src=&#34;/images/release-discipline/flag-lifecycle.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ownership split that matters:&lt;/strong&gt; engineering owns &lt;em&gt;whether the flag exists and works&lt;/em&gt;; product/support own &lt;em&gt;when it flips for whom&lt;/em&gt;. That split is still correct, it just now needs a &lt;strong&gt;flag registry with an expiry date on every rollout flag&lt;/strong&gt;, reviewed monthly, or the flag count grows faster than the org&amp;rsquo;s ability to reason about it. AI-generated code makes it trivially easy to wrap a new flag around everything; that&amp;rsquo;s a reason to enforce the registry harder, not skip it.&lt;/p&gt;
&lt;h3 id=&#34;2-progressive-rollout-rings&#34;&gt;2. Progressive rollout rings&lt;/h3&gt;
&lt;p&gt;Don&amp;rsquo;t choose between &amp;ldquo;ship to everyone&amp;rdquo; and &amp;ldquo;ship to no one.&amp;rdquo; Use rings, and pick the entry ring based on the blast-radius class above:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Internal&lt;/strong&gt; — team, then company-wide dogfooding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design partners / opt-in beta&lt;/strong&gt; — customers who explicitly asked to try new things early. This is where self-service enablement lives (see below).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Staged percentage&lt;/strong&gt; — 5% → 25% → 100%, gated on real usage signals and support ticket volume, not a calendar date.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;General availability&lt;/strong&gt; — announced, documented, supported.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&#34;Progressive Rollout diagram&#34; src=&#34;/images/decoupling-deployment/progressive-rollout.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;A change only needs to pass through every ring if it&amp;rsquo;s disruptive. Additive, low-risk changes can compress rings 3–4. The point isn&amp;rsquo;t ceremony, it&amp;rsquo;s that &lt;em&gt;someone decided&lt;/em&gt; how much exposure this change gets before it got any, instead of exposure being a side effect of when the deploy happened to land.&lt;/p&gt;
&lt;h3 id=&#34;3-self-service-enablement-beta-opt-in&#34;&gt;3. Self-service enablement (beta opt-in)&lt;/h3&gt;
&lt;p&gt;Give customers a way to &lt;em&gt;choose&lt;/em&gt; to be early, rather than &lt;em&gt;discovering&lt;/em&gt; they&amp;rsquo;re early. Concretely: an in-product &amp;ldquo;early access&amp;rdquo; or &amp;ldquo;labs&amp;rdquo; area where customers can turn on features ahead of GA, with a visible way to turn them back off. This does two things at once:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It converts &amp;ldquo;why did this change on me&amp;rdquo; into &amp;ldquo;I opted into this.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;It gives you a self-selected, motivated feedback cohort before wide rollout, which is a better signal than support tickets after the fact.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The precondition for this to work: opted-in features must be genuinely reversible by the customer. If turning it off doesn&amp;rsquo;t actually turn it off, don&amp;rsquo;t offer it as opt-in, that&amp;rsquo;s a forced change wearing an opt-in costume, and customers notice the difference immediately.&lt;/p&gt;
&lt;h3 id=&#34;4-change-communication-tiered-to-disruption-level&#34;&gt;4. Change communication, tiered to disruption level&lt;/h3&gt;
&lt;p&gt;Not every change deserves the same announcement weight. Matching the tier from the blast-radius table:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Additive:&lt;/strong&gt; changelog / release notes. Low ceremony, always shipped.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Behavioral:&lt;/strong&gt; in-app notice &lt;em&gt;before&lt;/em&gt; the change reaches a user&amp;rsquo;s account, plus changelog. Should say what&amp;rsquo;s changing and, if relevant, how to preview it early via opt-in beta.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disruptive / breaking:&lt;/strong&gt; direct communication (email, CSM, in-app banner with acknowledgment) with a stated timeline, not just a mention in release notes. If there&amp;rsquo;s a deadline for an old behavior going away, that deadline should be visible to the customer well before it arrives, not just to us.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A useful gut check: if a customer would reasonably say &amp;ldquo;I wish someone had told me,&amp;rdquo; the tier was too low.&lt;/p&gt;
&lt;h3 id=&#34;5-deprecation-without-forced-change&#34;&gt;5. Deprecation without forced change&lt;/h3&gt;
&lt;p&gt;The single biggest driver of the &amp;ldquo;forced change&amp;rdquo; complaint is removing something before the data says it&amp;rsquo;s safe to. The pattern that avoids it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;New path ships behind a flag, old path stays live.&lt;/li&gt;
&lt;li&gt;Both paths run in parallel long enough to gather real usage data, not a fixed arbitrary window, but until usage of the old path is actually low or zero.&lt;/li&gt;
&lt;li&gt;A minimum notice period is announced &lt;em&gt;before&lt;/em&gt; the old path is scheduled for removal, sized to the disruption class (days for a minor UI tweak, months for a workflow customers have built process around).&lt;/li&gt;
&lt;li&gt;Only once notice has elapsed and usage has dropped does the old path get deleted, as its own change, separately reviewed from the feature that replaced it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&#34;Dual code paths diagram&#34; src=&#34;/images/decoupling-deployment/dual-code-paths.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;This costs engineering effort (two paths, temporarily) in exchange for the thing customers are actually asking for: predictability. That trade is almost always worth making for anything customer-facing.&lt;/p&gt;
&lt;h2 id=&#34;what-ai-accelerated-development-changes-specifically&#34;&gt;What AI-accelerated development changes, specifically&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The proposal rate goes up, the review/rollout rate doesn&amp;rsquo;t automatically follow.&lt;/strong&gt; The gap between them is where uncontrolled change leaks out. Treat rollout classification as a required step in the definition of done, not an optional nicety, it&amp;rsquo;s the part of the pipeline that didn&amp;rsquo;t get faster, so it needs to be protected, not skipped under pressure to keep pace.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flag sprawl accelerates.&lt;/strong&gt; If it&amp;rsquo;s cheap to generate a flag-wrapped change, flags will be created faster than they&amp;rsquo;re retired unless the registry-and-expiry habit from the toolkit above is enforced, not just recommended.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;It&amp;rsquo;s just a small change&amp;rdquo; stops being a reliable signal.&lt;/strong&gt; AI can produce a large, behaviorally significant change with the same apparent effort as a small one. Blast-radius classification should be based on what the change &lt;em&gt;does&lt;/em&gt;, not how much manual effort it took to write, that correlation has broken.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Volume of change is a communications problem now, not just an engineering one.&lt;/strong&gt; If ship velocity increases, either communication cadence scales with it, or customers experience the increase as noise. Product/support capacity to write good change notices becomes a real constraint on release pace, plan for it explicitly rather than discovering it during a rollout.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;a-maturity-model-to-self-assess-against&#34;&gt;A maturity model to self-assess against&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Deploy vs release&lt;/th&gt;
&lt;th&gt;Flags&lt;/th&gt;
&lt;th&gt;Communication&lt;/th&gt;
&lt;th&gt;Deprecation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;0 — Coupled&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deploy = release, always&lt;/td&gt;
&lt;td&gt;None, or ad hoc&lt;/td&gt;
&lt;td&gt;Release notes after the fact, if at all&lt;/td&gt;
&lt;td&gt;Rip and replace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1 — Flags exist&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Some features flagged&lt;/td&gt;
&lt;td&gt;Used inconsistently, no registry&lt;/td&gt;
&lt;td&gt;Changelog exists&lt;/td&gt;
&lt;td&gt;Removal decided by engineering alone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2 — Rings defined&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Standard for risky changes&lt;/td&gt;
&lt;td&gt;Registry exists, no expiry discipline&lt;/td&gt;
&lt;td&gt;Tiered by change type&lt;/td&gt;
&lt;td&gt;Notice periods exist but informal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3 — Customer-facing control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Default practice&lt;/td&gt;
&lt;td&gt;Expiry dates enforced, monthly review&lt;/td&gt;
&lt;td&gt;Self-serve beta / early access live&lt;/td&gt;
&lt;td&gt;Data-gated removal, formal notice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4 — Governed change contract&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Assumed, invisible as a decision&lt;/td&gt;
&lt;td&gt;Flags treated as inventory with owners&lt;/td&gt;
&lt;td&gt;Change comms scale with ship velocity by design&lt;/td&gt;
&lt;td&gt;Deprecation SLA is a documented customer commitment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Most orgs feeling the pain described at the top of this post are sitting between Level 0 and 1, while their &lt;em&gt;code output&lt;/em&gt; has jumped to what used to require a Level 3 org&amp;rsquo;s engineering throughput. That mismatch, velocity outrunning governance, is the actual root cause, not &amp;ldquo;we ship too much&amp;rdquo; or &amp;ldquo;AI is risky.&amp;rdquo; The fix is closing the governance gap, not throttling the code.&lt;/p&gt;
&lt;h2 id=&#34;getting-started-in-order&#34;&gt;Getting started, in order&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Adopt the four-question test and blast-radius table&lt;/strong&gt; as a required checklist step before merge for anything customer-visible. This alone catches most of the &amp;ldquo;forced change&amp;rdquo; and &amp;ldquo;no warning&amp;rdquo; complaints.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stand up a flag registry with expiry dates.&lt;/strong&gt; Even a spreadsheet beats nothing. Review monthly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Define your rings&lt;/strong&gt; and who has authority to move a change from one ring to the next.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ship a self-serve early-access surface&lt;/strong&gt;, even a minimal one. It reframes the relationship from &amp;ldquo;this happened to me&amp;rdquo; to &amp;ldquo;I chose this.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write a deprecation SLA&lt;/strong&gt;, minimum notice periods by disruption class, and hold to it publicly. This is the fastest way to rebuild trust with customers who&amp;rsquo;ve been burned by forced changes before.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;the-bottom-line&#34;&gt;The bottom line&lt;/h2&gt;
&lt;p&gt;AI didn&amp;rsquo;t create the need for release discipline, it just removed the natural speed limit that used to give teams cover for not having it. The teams that get faster &lt;em&gt;and&lt;/em&gt; keep customer trust in 2026 aren&amp;rsquo;t the ones writing more code carefully. They&amp;rsquo;re the ones who separated &amp;ldquo;we built it&amp;rdquo; from &amp;ldquo;you see it&amp;rdquo; a long time ago, and are now deliberately re-tuning that separation for a world where the first half of that sentence happens ten times faster than it used to.&lt;/p&gt;
&lt;p&gt;Deploy fearlessly. Release deliberately. That was true before AI. It&amp;rsquo;s the whole game now.&lt;/p&gt;
</content>
    </item>
    
    <item>
      <title>Decoupling Deployment from Release: An Architectural Imperative</title>
      <link>/posts/decoupling-deployment-from-release/</link>
      <pubDate>Tue, 30 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>/posts/decoupling-deployment-from-release/</guid>
      <description>Photo by Patrick Konior on Unsplash
We need to talk about how we ship software. Not because we&amp;rsquo;re doing it wrong, but because we can do it so much better, for our customers, for our colleagues, and for ourselves.
The Core Problem: Deployment Isn&amp;rsquo;t Release Here&amp;rsquo;s the shift we need to make: deploying code and releasing features are not the same thing, and they shouldn&amp;rsquo;t happen at the same moment.</description>
      <content>&lt;p&gt;&lt;img alt=&#34;Control room overview&#34; src=&#34;/images/decoupling-deployment/hero-control-room.jpg&#34;&gt;
&lt;em&gt;Photo by &lt;a href=&#34;https://unsplash.com/@patrickkonior&#34;&gt;Patrick Konior&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/photos/a-view-of-a-control-room-from-above-FwHJ6mJjVd4&#34;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We need to talk about how we ship software. Not because we&amp;rsquo;re doing it wrong, but because we can do it so much better, for our customers, for our colleagues, and for ourselves.&lt;/p&gt;
&lt;h2 id=&#34;the-core-problem-deployment-isnt-release&#34;&gt;The Core Problem: Deployment Isn&amp;rsquo;t Release&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the shift we need to make: &lt;strong&gt;deploying code and releasing features are not the same thing, and they shouldn&amp;rsquo;t happen at the same moment.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Deployment vs. Release Timeline diagram&#34; src=&#34;/images/decoupling-deployment/deployment-vs-release-timeline.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;When we conflate deployment with release, we create unnecessary risk and friction. We deploy code to production, and suddenly a feature is live, ready or not. If something goes wrong, we scramble. We hotfix. We roll back entire deployments, potentially affecting unrelated changes. We make our product and support teams reactive instead of strategic.&lt;/p&gt;
&lt;p&gt;There is a better way.&lt;/p&gt;
&lt;h2 id=&#34;why-this-matters-safety-first&#34;&gt;Why This Matters: Safety First&lt;/h2&gt;
&lt;p&gt;Our customers trust us with their business. Our colleagues across product, support, and operations depend on stable, predictable releases. When we tie deployment directly to feature availability, we put both at risk.&lt;/p&gt;
&lt;p&gt;Safe software releases mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Our customers experience fewer disruptions&lt;/li&gt;
&lt;li&gt;Our support team can prepare for changes before they go live&lt;/li&gt;
&lt;li&gt;Our product team can control the narrative and timing of new features&lt;/li&gt;
&lt;li&gt;Our engineers can deploy confidently, knowing they have safety nets in place&lt;/li&gt;
&lt;li&gt;We can see the impact of our changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn&amp;rsquo;t about adding bureaucracy. It&amp;rsquo;s about adding control.&lt;/p&gt;
&lt;h2 id=&#34;the-mindset-shift-for-engineers&#34;&gt;The Mindset Shift for Engineers&lt;/h2&gt;
&lt;p&gt;I know what some of you are thinking: &amp;ldquo;This sounds like more process. More overhead. More barriers between my code and production.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Let me reframe it: What if deployment was &lt;strong&gt;easier&lt;/strong&gt; because it was &lt;strong&gt;safer&lt;/strong&gt;? What if you could push code to production multiple times a day without the anxiety of &amp;ldquo;did we just break something for customers?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This requires us to think differently:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code goes to production &lt;strong&gt;dark&lt;/strong&gt;, deployed but not activated&lt;/li&gt;
&lt;li&gt;Features are controlled by flags, not by deployment timing&lt;/li&gt;
&lt;li&gt;Your code can live in production for days or weeks before anyone uses it&lt;/li&gt;
&lt;li&gt;When issues arise, you flip a switch instead of rolling back a deployment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;Dark launch diagram&#34; src=&#34;/images/decoupling-deployment/dark-launch.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;This is actually &lt;strong&gt;more&lt;/strong&gt; engineering control, not less. You own the technical deployment. Product and support teams own the feature release timing. Everyone wins.&lt;/p&gt;
&lt;h2 id=&#34;empowering-product-and-support&#34;&gt;Empowering Product and Support&lt;/h2&gt;
&lt;p&gt;Our product managers understand customer needs, market timing, and strategic rollout. Our support team knows when they&amp;rsquo;re ready to handle inquiries about new features. Our documentation should be created in production.&lt;/p&gt;
&lt;p&gt;When we give them control over feature flags, we put release decisions in the hands of the people best positioned to make them. Engineering provides the capability; product and support control the activation.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t about taking power away from engineering, it&amp;rsquo;s about giving everyone the right kind of power.&lt;/p&gt;
&lt;h2 id=&#34;stop-removing-what-people-still-use&#34;&gt;Stop Removing What People Still Use&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve all been there: a feature is marked for deprecation, so we rip it out. Then we discover customers were still using it, or they needed more transition time.&lt;/p&gt;
&lt;p&gt;With feature flags and dual code paths, we can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run old and new implementations side by side&lt;/li&gt;
&lt;li&gt;Give customers time to migrate naturally&lt;/li&gt;
&lt;li&gt;Gather actual usage data before removal&lt;/li&gt;
&lt;li&gt;Roll back feature changes without rolling back deployments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We keep both paths alive until we &lt;strong&gt;know&lt;/strong&gt; the old one isn&amp;rsquo;t needed. Data drives decisions, not assumptions.&lt;/p&gt;
&lt;h2 id=&#34;creating-dual-code-paths&#34;&gt;Creating Dual Code Paths&lt;/h2&gt;
&lt;p&gt;The technical pattern is straightforward:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;if (featureFlag.isEnabled(&amp;#39;new-checkout-flow&amp;#39;)) {
  // New implementation
  return enhancedCheckout();
} else {
  // Current implementation
  return traditionalCheckout();
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt=&#34;Dual code paths diagram&#34; src=&#34;/images/decoupling-deployment/dual-code-paths.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;This enables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rapid feature releases, toggle a flag, feature goes live&lt;/li&gt;
&lt;li&gt;Instant rollbacks, toggle it back if issues arise&lt;/li&gt;
&lt;li&gt;Gradual rollouts, enable for 10% of users, then 50%, then 100%&lt;/li&gt;
&lt;li&gt;A/B testing, compare new vs. old with real data&lt;/li&gt;
&lt;li&gt;Safe deprecation, maintain the old path until usage drops to zero&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;![[Excalidraw/Rollback Comparison.excalidraw]]&lt;/p&gt;
&lt;p&gt;![[Excalidraw/Progressive Rollout.excalidraw]]&lt;/p&gt;
&lt;p&gt;Yes, you maintain two paths temporarily. But the flexibility and safety are worth it.&lt;/p&gt;
&lt;h2 id=&#34;we-already-test-in-production-lets-do-it-right&#34;&gt;We Already Test in Production, Let&amp;rsquo;s Do It Right&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s an uncomfortable truth: we all test in production. Even with the best staging environments, production has data patterns, load characteristics, and edge cases we can&amp;rsquo;t fully replicate.&lt;/p&gt;
&lt;p&gt;Feature flags let us test in production &lt;strong&gt;safely&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enable new features for internal users first&lt;/li&gt;
&lt;li&gt;Roll out to beta customers who opt in&lt;/li&gt;
&lt;li&gt;Gradually expand to broader audiences&lt;/li&gt;
&lt;li&gt;Monitor in real time and react instantly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of pretending we don&amp;rsquo;t test in production, let&amp;rsquo;s acknowledge it and build systems that make it safe and controlled.&lt;/p&gt;
&lt;h2 id=&#34;making-monitoring-and-observability-easier&#34;&gt;Making Monitoring and Observability Easier&lt;/h2&gt;
&lt;p&gt;When features are flag-controlled, monitoring becomes clearer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dashboard metrics tagged by feature flag status&lt;/li&gt;
&lt;li&gt;Alerts that distinguish between feature issues and infrastructure issues&lt;/li&gt;
&lt;li&gt;A/B comparison of performance between flag states&lt;/li&gt;
&lt;li&gt;Clear correlation between flag changes and system behaviour&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;![[Excalidraw/Observability Dashboard.excalidraw]]&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll spend less time debugging &amp;ldquo;what changed?&amp;rdquo; because you&amp;rsquo;ll know exactly what changed and when.&lt;/p&gt;
&lt;h2 id=&#34;this-is-about-your-value&#34;&gt;This Is About Your Value&lt;/h2&gt;
&lt;p&gt;Every engineer brings immense value. You solve complex problems. You build systems that serve customers. You keep the platform running.&lt;/p&gt;
&lt;p&gt;This approach amplifies your impact:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deploy more frequently without stress&lt;/li&gt;
&lt;li&gt;Spend less time on hotfixes and emergency rollbacks&lt;/li&gt;
&lt;li&gt;Focus on building new capabilities instead of managing release logistics&lt;/li&gt;
&lt;li&gt;See your features succeed because they&amp;rsquo;re released at the right time, to the right users&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your technical expertise deserves better tools. Feature-flagged releases are those better tools.&lt;/p&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;We don&amp;rsquo;t need to transform everything overnight. Here&amp;rsquo;s how we can begin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Start with your next major feature&lt;/strong&gt;, wrap it in a feature flag&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrate flags into your monitoring&lt;/strong&gt;, make flag status visible in dashboards&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coordinate with product and support&lt;/strong&gt;, let them control release timing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gather data before deprecation&lt;/strong&gt;, keep old code paths until usage proves they&amp;rsquo;re unnecessary&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share what works&lt;/strong&gt;, as teams succeed with this approach, spread the practices&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is a journey, not a destination. Each team can adopt at their own pace.&lt;/p&gt;
&lt;h2 id=&#34;the-bottom-line&#34;&gt;The Bottom Line&lt;/h2&gt;
&lt;p&gt;Separating deployment from release isn&amp;rsquo;t just a technical practice, it is a philosophy of safety, control, and collaboration. It acknowledges that great software delivery involves engineering excellence &lt;strong&gt;and&lt;/strong&gt; thoughtful release management.&lt;/p&gt;
&lt;p&gt;We have the talent. We have the technical capability. Now let&amp;rsquo;s build the practices that let us ship with confidence.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s deploy fearlessly and release deliberately. Our customers, our colleagues, and our code deserve nothing less.&lt;/p&gt;
</content>
    </item>
    
  </channel>
</rss>
