<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>The FinOps Engineer Blog</title>
        <link>https://finops-engineer.vercel.app/blog</link>
        <description>The FinOps Engineer Blog</description>
        <lastBuildDate>Sat, 14 Mar 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Bypassing the Velocity Wall: Trunk-Based Development in Regulated Environments]]></title>
            <link>https://finops-engineer.vercel.app/blog/trunk-based-governance</link>
            <guid>https://finops-engineer.vercel.app/blog/trunk-based-governance</guid>
            <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How to maintain development velocity without failing enterprise banking audits.]]></description>
            <content:encoded><![CDATA[<p>In modern DevOps, Trunk-Based Development (TBD) is the gold standard for speed. However, in highly regulated environments like Banking, we face a <strong>"Velocity Wall"</strong>:</p>
<ul>
<li class=""><strong>Release Cycles:</strong> Deployments to Staging/Production happen every 2 months, not every 2 hours.</li>
<li class=""><strong>Audit Friction:</strong> "100 docs," rigorous security scans, and manual approvals are required for every production artifact.</li>
<li class=""><strong>The "Obsolete Scan" Trap:</strong> Scans performed at the start of a 2-month window are often deemed "stale" by the time approval is granted, forcing costly rebuilds.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-gitflow-sandwich-anti-pattern">The "GitFlow Sandwich" Anti-Pattern<a href="https://finops-engineer.vercel.app/blog/trunk-based-governance#the-gitflow-sandwich-anti-pattern" class="hash-link" aria-label="Direct link to The &quot;GitFlow Sandwich&quot; Anti-Pattern" title="Direct link to The &quot;GitFlow Sandwich&quot; Anti-Pattern" translate="no">​</a></h2>
<p>To cope with this friction, teams often introduce a complex web of <code>develop</code> and <code>master</code> branches to "match" environments. This leads to a "PR Mess" of manual version bumps, constant merge conflicts, and wasted compute cycles rebuilding the same code.</p>
<!-- -->
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>The Anti-Pattern</div><div class="admonitionContent_BuS1"><p>Tying branches to environments forces continuous rebuilding and complex backports.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-solution-the-promotion-by-tag-model">The Solution: The "Promotion-by-Tag" Model<a href="https://finops-engineer.vercel.app/blog/trunk-based-governance#the-solution-the-promotion-by-tag-model" class="hash-link" aria-label="Direct link to The Solution: The &quot;Promotion-by-Tag&quot; Model" title="Direct link to The Solution: The &quot;Promotion-by-Tag&quot; Model" translate="no">​</a></h2>
<p>Instead of using branches to represent environments (which creates an integration tax), we move to a Tag-Based Release strategy. This decouples our Integration (<code>main</code>) from our Promotion (Release Candidates).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-continuous-integration-the-trunk">1. Continuous Integration (The Trunk)<a href="https://finops-engineer.vercel.app/blog/trunk-based-governance#1-continuous-integration-the-trunk" class="hash-link" aria-label="Direct link to 1. Continuous Integration (The Trunk)" title="Direct link to 1. Continuous Integration (The Trunk)" translate="no">​</a></h3>
<p>Developers merge small, frequent PRs into <code>main</code>. CI builds an immutable artifact for every commit. Artifacts are automatically deployed to Internal/Dev (INT) for testing. Scans run immediately.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-the-release-candidate-rc-hook">2. The Release Candidate (RC) Hook<a href="https://finops-engineer.vercel.app/blog/trunk-based-governance#2-the-release-candidate-rc-hook" class="hash-link" aria-label="Direct link to 2. The Release Candidate (RC) Hook" title="Direct link to 2. The Release Candidate (RC) Hook" translate="no">​</a></h3>
<p>When the release scope is confirmed, we do not cut a branch. We Tag the successful commit in <code>main</code> (e.g., <code>git tag rc-2026.03.01</code>). This tag serves as the "frozen" reference for the auditors.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-immutable-artifact-promotion">3. Immutable Artifact Promotion<a href="https://finops-engineer.vercel.app/blog/trunk-based-governance#3-immutable-artifact-promotion" class="hash-link" aria-label="Direct link to 3. Immutable Artifact Promotion" title="Direct link to 3. Immutable Artifact Promotion" translate="no">​</a></h3>
<p>The exact same artifact tested in INT is promoted to Staging. No rebuilds. No "Version PRs" on <code>main</code>. The tag is the version.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-handling-late-cycle-fixes-the-detached-patch">4. Handling Late-Cycle Fixes (The Detached Patch)<a href="https://finops-engineer.vercel.app/blog/trunk-based-governance#4-handling-late-cycle-fixes-the-detached-patch" class="hash-link" aria-label="Direct link to 4. Handling Late-Cycle Fixes (The Detached Patch)" title="Direct link to 4. Handling Late-Cycle Fixes (The Detached Patch)" translate="no">​</a></h3>
<p>If a vulnerability is found during the 2-month approval window, a temporary branch is cut directly from the tag. The fix is applied, a new tag is created (e.g., <code>rc-2026.03.02</code>), and the fix is cherry-picked back to <code>main</code>.</p>
<a id="promotion-flowchart"></a>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-wins-for-finops--devops">Why This Wins for FinOps &amp; DevOps<a href="https://finops-engineer.vercel.app/blog/trunk-based-governance#why-this-wins-for-finops--devops" class="hash-link" aria-label="Direct link to Why This Wins for FinOps &amp; DevOps" title="Direct link to Why This Wins for FinOps &amp; DevOps" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Feature</th><th style="text-align:left">The Impact</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Reduced "PR Tax"</strong></td><td style="text-align:left">Eliminates manual version-bump PRs and complex <code>develop</code> -&gt; <code>main</code> merges. Developers spend time coding, not resolving conflicts.</td></tr><tr><td style="text-align:left"><strong>Immutable Audits</strong></td><td style="text-align:left">A Tag provides a 1:1 map between Code → Scan → Artifact → Deployment. Auditors love the explicit traceability.</td></tr><tr><td style="text-align:left"><strong>Shift-Left Security</strong></td><td style="text-align:left">Scans run on every <code>main</code> commit. By the time you "Tag," you already have 2 months of clean scan history to present to governance.</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>The FinOps Angle: "Build Once, Promote Many"</div><div class="admonitionContent_BuS1"><p>Every time your CI pipeline runs a build, you are burning compute minutes. In a standard GitFlow model, moving code from Dev -&gt; Staging -&gt; Prod often triggers three separate builds of the exact same codebase just to update environment variables or branch names.</p><p>By utilizing immutable tags, you adopt a <strong>"Build Once, Promote Many"</strong> architecture. You pay for the compute to compile the artifact and run the security scan exactly once. Promoting that artifact to Staging or Production is merely a metadata update and an image pull, driving your CI compute costs down significantly while eliminating the risk of configuration drift between environments.</p></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>The Takeaway</div><div class="admonitionContent_BuS1"><p>Don't use Git branches to solve organizational bureaucracy. Use <strong>Tags</strong> to create a stable "Promotion Path" while keeping your development trunk fast, lean, and continuous.</p></div></div>]]></content:encoded>
            <category>DevOps</category>
            <category>CI/CD</category>
            <category>FinOps</category>
            <category>Governance</category>
        </item>
    </channel>
</rss>