{"id":77520,"date":"2026-07-07T05:02:02","date_gmt":"2026-07-07T05:02:02","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=77520"},"modified":"2026-07-07T05:02:05","modified_gmt":"2026-07-07T05:02:05","slug":"trunk-based-development-master-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/trunk-based-development-master-tutorial\/","title":{"rendered":"Trunk-Based Development Master Tutorial"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">From Beginner to Advanced: A Complete One-Stop Guide to Fast, Safe, Continuous Software Delivery<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. What is trunk-based development?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Trunk-based development<\/strong>, often shortened as <strong>TBD<\/strong>, is a source-control branching strategy where developers integrate small changes frequently into one shared main branch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That shared branch is usually called:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nmaster\ntrunk\nmainline\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Modern repositories usually call it <code>main<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The core definition:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Trunk-based development is a branching model where developers collaborate around a single main branch and avoid long-lived development branches.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">The trunk-based development reference site defines it as a source-control branching model where developers collaborate on code in a single branch called trunk and resist creating long-lived development branches by using supporting techniques.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. The simplest mental model<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Traditional branch-heavy model:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Work privately for days\/weeks \u2192 merge later \u2192 suffer integration pain\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Trunk-based model:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Integrate tiny changes continuously \u2192 <span class=\"hljs-keyword\">catch<\/span> problems early \u2192 keep main releasable\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In one line:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Trunk-based development makes integration continuous instead of occasional.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. The big idea<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The big idea is not \u201ceveryone randomly pushes to main.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That is chaos, not trunk-based development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The real idea is:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Everyone works close to main.\nChanges are small.\nCI is fast.\nMain stays healthy.\nIncomplete work is hidden <span class=\"hljs-keyword\">with<\/span> feature flags.\nProduction can be released or rolled back safely.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Small change]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Short-lived branch or direct commit]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Fast CI]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Review or pair review]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Merge to trunk\/main]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Build artifact]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Deploy safely]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Release with flag or rollout]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Observe]<\/span>\n    <span class=\"hljs-selector-tag\">I<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">J<\/span><span class=\"hljs-selector-attr\">&#91;Rollback or continue]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">AWS DevOps Guidance recommends trunk-based development paired with a pull-request workflow using short-lived feature branches as an effective DevOps branching strategy, mainly because it promotes continuous integration and helps teams discover integration problems earlier.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Why trunk-based development exists<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Software teams often suffer from delayed integration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Developer A works on feature branch for 2 weeks.\nDeveloper B works on another branch for 2 weeks.\nDeveloper C changes shared code.\nQA starts late.\nMerge conflicts explode.\nRelease becomes scary.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development attacks this problem directly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It says:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Do<\/span> not delay integration.\nMake integration small, frequent, automated, <span class=\"hljs-keyword\">and<\/span> safe.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. The trunk<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>trunk<\/strong> is the central branch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Usually:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Sometimes:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">trunk\nmaster\nmainline\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Rules:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Trunk must stay healthy.<\/li>\n\n\n\n<li>Trunk must be protected.<\/li>\n\n\n\n<li>Trunk must have fast feedback.<\/li>\n\n\n\n<li>Trunk must be releasable or close to releasable.<\/li>\n\n\n\n<li>Trunk must not become a dumping ground.<\/li>\n\n\n\n<li>Trunk should not contain uncontrolled broken work.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"A\"<\/span>\n    commit id: <span class=\"hljs-string\">\"B\"<\/span>\n    commit id: <span class=\"hljs-string\">\"C\"<\/span>\n    commit id: <span class=\"hljs-string\">\"D\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Simple trunk-only history looks boring. That is the point. Boring history, exciting delivery. Chef\u2019s kiss.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Trunk-based development is not the same as no branches<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">There are two common styles.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6.1 Direct-to-trunk<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Developers commit directly to <code>main<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"A\"<\/span>\n    commit id: <span class=\"hljs-string\">\"small fix\"<\/span>\n    commit id: <span class=\"hljs-string\">\"tiny feature\"<\/span>\n    commit id: <span class=\"hljs-string\">\"refactor\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Best for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>very small teams<\/li>\n\n\n\n<li>pair programming<\/li>\n\n\n\n<li>extremely strong CI<\/li>\n\n\n\n<li>mature engineering culture<\/li>\n\n\n\n<li>internal tools<\/li>\n\n\n\n<li>teams with high trust and fast rollback<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">6.2 Short-lived branch to trunk<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Developers create tiny branches and merge them quickly through PR\/MR.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"A\"<\/span>\n    branch small-change\n    checkout small-change\n    commit id: <span class=\"hljs-string\">\"B\"<\/span>\n    checkout main\n    merge small-change\n    commit id: <span class=\"hljs-string\">\"C\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Best for most teams.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The trunk-based development reference describes short-lived feature branches as branches that are destined to come back as pull requests into main\/trunk.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Direct-to-trunk vs short-lived PR branches<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Area<\/th><th>Direct-to-trunk<\/th><th>Short-lived PR branch<\/th><\/tr><\/thead><tbody><tr><td>Speed<\/td><td>Very high<\/td><td>High<\/td><\/tr><tr><td>Review<\/td><td>Pair\/mob\/post-commit review<\/td><td>Pull request review<\/td><\/tr><tr><td>Risk<\/td><td>Higher without discipline<\/td><td>Lower<\/td><\/tr><tr><td>CI requirement<\/td><td>Critical<\/td><td>Critical<\/td><\/tr><tr><td>Best for<\/td><td>tiny mature teams<\/td><td>most professional teams<\/td><\/tr><tr><td>Branch lifetime<\/td><td>none<\/td><td>hours to 1\u20132 days<\/td><\/tr><tr><td>Governance<\/td><td>lighter<\/td><td>stronger<\/td><\/tr><tr><td>Common in enterprise?<\/td><td>less common<\/td><td>more common<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended default:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">short<\/span>-<span class=\"hljs-title\">lived<\/span> <span class=\"hljs-title\">PR<\/span> <span class=\"hljs-title\">branches<\/span> <span class=\"hljs-title\">into<\/span> <span class=\"hljs-title\">trunk<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This gives you trunk-based development benefits while keeping review and CI gates.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Trunk-based development vs feature branch workflow<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Area<\/th><th>Feature branch workflow<\/th><th>Trunk-based development<\/th><\/tr><\/thead><tbody><tr><td>Branch lifetime<\/td><td>can be days\/weeks<\/td><td>hours\/days<\/td><\/tr><tr><td>Integration<\/td><td>delayed<\/td><td>frequent<\/td><\/tr><tr><td>Release readiness<\/td><td>depends on branch discipline<\/td><td>trunk stays releasable<\/td><\/tr><tr><td>Merge conflicts<\/td><td>higher if branches live long<\/td><td>lower<\/td><\/tr><tr><td>Review size<\/td><td>can become large<\/td><td>small PRs<\/td><\/tr><tr><td>Feature flags<\/td><td>useful<\/td><td>very important<\/td><\/tr><tr><td>CI<\/td><td>important<\/td><td>critical<\/td><\/tr><tr><td>Delivery speed<\/td><td>medium\/high<\/td><td>high<\/td><\/tr><tr><td>Team maturity needed<\/td><td>medium<\/td><td>high<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Trunk-based development vs Gitflow<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Area<\/th><th>Gitflow<\/th><th>Trunk-based development<\/th><\/tr><\/thead><tbody><tr><td>Main branches<\/td><td><code>main<\/code> + <code>develop<\/code><\/td><td>mostly <code>main<\/code><\/td><\/tr><tr><td>Feature branches<\/td><td>common<\/td><td>very short-lived<\/td><\/tr><tr><td>Release branches<\/td><td>normal<\/td><td>optional\/rare<\/td><\/tr><tr><td>Hotfix branches<\/td><td>explicit<\/td><td>usually revert\/fix forward\/hotfix from trunk<\/td><\/tr><tr><td>Best for<\/td><td>scheduled\/versioned releases<\/td><td>continuous delivery<\/td><\/tr><tr><td>Complexity<\/td><td>high<\/td><td>lower branch complexity<\/td><\/tr><tr><td>Speed<\/td><td>medium<\/td><td>high<\/td><\/tr><tr><td>Governance<\/td><td>branch-driven<\/td><td>automation-driven<\/td><\/tr><tr><td>Feature flags<\/td><td>useful<\/td><td>nearly essential<\/td><\/tr><tr><td>Risk control<\/td><td>release branches<\/td><td>CI, flags, rollback, progressive rollout<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Gitflow can be excellent for mobile, desktop, firmware, SDKs, or products with formal release windows. Trunk-based development is usually stronger for SaaS, APIs, web systems, platform services, and teams practicing continuous delivery.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. The core rule<\/h1>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Integrate at least daily.\nPrefer multiple times per day.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A branch that lives too long becomes a private universe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Private universes eventually collide.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">xychart-beta\n    title <span class=\"hljs-string\">\"Branch age vs integration risk\"<\/span>\n    x-axis &#91;<span class=\"hljs-string\">\"1 hour\"<\/span>, <span class=\"hljs-string\">\"1 day\"<\/span>, <span class=\"hljs-string\">\"3 days\"<\/span>, <span class=\"hljs-string\">\"1 week\"<\/span>, <span class=\"hljs-string\">\"2 weeks\"<\/span>, <span class=\"hljs-string\">\"1 month\"<\/span>]\n    y-axis <span class=\"hljs-string\">\"Integration risk\"<\/span> <span class=\"hljs-number\">0<\/span> --&gt; <span class=\"hljs-number\">100<\/span>\n    bar &#91;<span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">25<\/span>, <span class=\"hljs-number\">45<\/span>, <span class=\"hljs-number\">75<\/span>, <span class=\"hljs-number\">95<\/span>]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The exact numbers are conceptual, but the pattern is real: the longer the branch lives, the more assumptions drift.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. The trunk-based development promise<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development promises:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>less merge pain<\/li>\n\n\n\n<li>faster feedback<\/li>\n\n\n\n<li>cleaner releases<\/li>\n\n\n\n<li>more reliable CI<\/li>\n\n\n\n<li>smaller pull requests<\/li>\n\n\n\n<li>easier rollback<\/li>\n\n\n\n<li>simpler branch structure<\/li>\n\n\n\n<li>better continuous delivery<\/li>\n\n\n\n<li>less branch archaeology<\/li>\n\n\n\n<li>less \u201cworks on my branch\u201d drama<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">But it only works when the team also commits to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>small changes<\/li>\n\n\n\n<li>strong CI<\/li>\n\n\n\n<li>automated tests<\/li>\n\n\n\n<li>feature flags<\/li>\n\n\n\n<li>protected trunk<\/li>\n\n\n\n<li>observability<\/li>\n\n\n\n<li>rollback discipline<\/li>\n\n\n\n<li>fast code review<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">DORA lists trunk-based development as a technical capability associated with software delivery and operational performance, within its broader catalog of DevOps capabilities.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. The basic trunk-based workflow<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">flowchart TD\n    A&#91;Start <span class=\"hljs-keyword\">from<\/span> latest main] --&gt; B&#91;Create tiny branch]\n    B --&gt; C&#91;Make small change]\n    C --&gt; D&#91;Run local checks]\n    D --&gt; E&#91;Push branch]\n    E --&gt; F&#91;Open PR\/MR]\n    F --&gt; G&#91;CI runs]\n    F --&gt; H&#91;Review]\n    G --&gt; I{CI green?}\n    H --&gt; J{Approved?}\n    I -- No --&gt; C\n    J -- No --&gt; C\n    I -- Yes --&gt; K&#91;Merge to main]\n    J -- Yes --&gt; K\n    K --&gt; L&#91;Delete branch]\n    L --&gt; M&#91;Deploy\/release safely]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Commands<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git checkout main\ngit pull --ff-only origin main\n\ngit checkout -b small\/change-login-error\n\n<span class=\"hljs-comment\"># edit files<\/span>\nmake test\n\ngit add .\ngit commit -m <span class=\"hljs-string\">\"fix(auth): show clear error for expired session\"<\/span>\ngit push -u origin small\/change-login-error\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">After PR merge:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout main\ngit pull --ff-only origin main\ngit branch -d small\/change-login-error\ngit fetch --prune\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. The advanced trunk-based workflow<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">flowchart TD\n    A&#91;Small work item] --&gt; B&#91;Design <span class=\"hljs-keyword\">if<\/span> risky]\n    B --&gt; C&#91;Short-lived branch]\n    C --&gt; D&#91;Code behind feature flag <span class=\"hljs-keyword\">if<\/span> incomplete]\n    D --&gt; E&#91;Local checks]\n    E --&gt; F&#91;PR\/MR]\n    F --&gt; G&#91;Fast CI]\n    G --&gt; H&#91;Security <span class=\"hljs-keyword\">and<\/span> quality gates]\n    H --&gt; I&#91;Merge to trunk]\n    I --&gt; J&#91;Build immutable artifact]\n    J --&gt; K&#91;Deploy to lower environment]\n    K --&gt; L&#91;Progressive production rollout]\n    L --&gt; M&#91;Observe metrics]\n    M --&gt; N{Healthy?}\n    N -- Yes --&gt; O&#91;<span class=\"hljs-keyword\">Continue<\/span> rollout]\n    N -- No --&gt; P&#91;Rollback \/ disable flag \/ revert]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is the grown-up version. Less drama. More control.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Branch naming in trunk-based development<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Because branches are short-lived, branch names should be simple and meaningful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended patterns:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">small\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">description<\/span>&gt;<\/span>\nfeature\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ticket<\/span>&gt;<\/span>-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">description<\/span>&gt;<\/span>\nbugfix\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ticket<\/span>&gt;<\/span>-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">description<\/span>&gt;<\/span>\nchore\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ticket<\/span>&gt;<\/span>-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">description<\/span>&gt;<\/span>\ndocs\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ticket<\/span>&gt;<\/span>-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">description<\/span>&gt;<\/span>\nsecurity\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ticket<\/span>&gt;<\/span>-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">description<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">feature\/EVP-123-add-device-filter\nbugfix\/EVP-224-fix-token-refresh\nchore\/EVP-301-upgrade-logging-lib\nsecurity\/EVP-777-mask-api-key\ndocs\/EVP-410-update-runbook\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Avoid:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">rajesh-work\ntest\nfinal\n<span class=\"hljs-keyword\">new<\/span>\nchanges\nbig-feature\n<span class=\"hljs-keyword\">do<\/span>-not-<span class=\"hljs-keyword\">delete<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That last one is how branches become haunted houses.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Branch lifetime policy<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Branch type<\/th><th>Ideal lifetime<\/th><th>Maximum recommended<\/th><\/tr><\/thead><tbody><tr><td>tiny fix<\/td><td>minutes to hours<\/td><td>same day<\/td><\/tr><tr><td>small feature<\/td><td>hours to 1 day<\/td><td>2\u20133 days<\/td><\/tr><tr><td>refactor slice<\/td><td>hours to 1 day<\/td><td>2\u20133 days<\/td><\/tr><tr><td>risky change behind flag<\/td><td>1\u20132 days<\/td><td>under 1 week<\/td><\/tr><tr><td>experiment<\/td><td>hours\/days<\/td><td>1 week<\/td><\/tr><tr><td>release branch, if used<\/td><td>short stabilization window<\/td><td>product-dependent<\/td><\/tr><tr><td>long-lived feature branch<\/td><td>avoid<\/td><td>avoid<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Hard rule:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">A trunk-based feature branch should not become a second integration branch.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Pull request size policy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development is powered by small PRs.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>PR size<\/th><th>Review quality<\/th><\/tr><\/thead><tbody><tr><td>1\u2013100 lines<\/td><td>excellent<\/td><\/tr><tr><td>100\u2013300 lines<\/td><td>good<\/td><\/tr><tr><td>300\u2013600 lines<\/td><td>acceptable with context<\/td><\/tr><tr><td>600\u20131,000 lines<\/td><td>risky<\/td><\/tr><tr><td>1,000+ lines<\/td><td>split unless generated<\/td><\/tr><tr><td>5,000+ lines<\/td><td>archaeology, not review<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Small PRs, fast review, fast merge.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. What \u201csmall\u201d really means<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A small change is not just fewer lines.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A small change has:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>one purpose<\/li>\n\n\n\n<li>clear rollback<\/li>\n\n\n\n<li>clear test scope<\/li>\n\n\n\n<li>clear owner<\/li>\n\n\n\n<li>low hidden risk<\/li>\n\n\n\n<li>readable diff<\/li>\n\n\n\n<li>limited blast radius<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Bad PR:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Add payment retries, refactor billing, update UI, rename database fields, upgrade framework\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good PR split:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">PR 1: add retry config type\nPR 2: add idempotency key support\nPR 3: add retry logic behind flag\nPR 4: add metrics\nPR 5: enable internally\nPR 6: enable gradually\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Big risky feature]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Safe slice 1]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Safe slice 2]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Safe slice 3]<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Safe slice 4]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Merge to trunk]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. The role of CI in trunk-based development<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">CI is not optional in trunk-based development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CI answers:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Can <span class=\"hljs-keyword\">this<\/span> tiny change safely join trunk?\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;PR to main] --&gt; B&#91;Checkout]\n    B --&gt; C&#91;Install dependencies]\n    C --&gt; D&#91;Format check]\n    D --&gt; E&#91;Lint]\n    E --&gt; F&#91;Unit tests]\n    F --&gt; G&#91;Build]\n    G --&gt; H&#91;Integration tests]\n    H --&gt; I&#91;Security checks]\n    I --&gt; J{Green?}\n    J -- Yes --&gt; K&#91;Merge allowed]\n    J -- No --&gt; L&#91;Merge blocked]\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">GitHub protected branch rules can require status checks, reviews, linear history, and other constraints before changes land on important branches.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. CI speed matters<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If CI takes too long, trunk-based development slows down.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>CI duration<\/th><th>Effect<\/th><\/tr><\/thead><tbody><tr><td>under 5 minutes<\/td><td>excellent<\/td><\/tr><tr><td>5\u201310 minutes<\/td><td>good<\/td><\/tr><tr><td>10\u201320 minutes<\/td><td>acceptable<\/td><\/tr><tr><td>20\u201345 minutes<\/td><td>painful<\/td><\/tr><tr><td>45+ minutes<\/td><td>developers batch changes and avoid frequent integration<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Best practice:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Fast CI for merge.\nDeep CI after merge or nightly.\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Two-level CI model<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;PR CI]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Fast checks]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Merge to main]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Post-merge CI]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Deeper integration tests]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Performance tests]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Security scans]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Nightly\/regression]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Required CI gates<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Minimum gates<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Gate<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>format check<\/td><td>consistent code<\/td><\/tr><tr><td>lint<\/td><td>static mistakes<\/td><\/tr><tr><td>unit tests<\/td><td>logic correctness<\/td><\/tr><tr><td>build<\/td><td>package validity<\/td><\/tr><tr><td>type check<\/td><td>compile\/type safety<\/td><\/tr><tr><td>secret scan<\/td><td>prevent leaked credentials<\/td><\/tr><tr><td>dependency scan<\/td><td>vulnerable library detection<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Stronger gates<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Gate<\/th><th>Purpose<\/th><\/tr><\/thead><tbody><tr><td>integration tests<\/td><td>cross-component confidence<\/td><\/tr><tr><td>contract tests<\/td><td>API compatibility<\/td><\/tr><tr><td>container scan<\/td><td>image safety<\/td><\/tr><tr><td>IaC scan<\/td><td>cloud misconfig detection<\/td><\/tr><tr><td>license scan<\/td><td>compliance<\/td><\/tr><tr><td>policy-as-code<\/td><td>enforce standards<\/td><\/tr><tr><td>smoke test<\/td><td>deployment confidence<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. Protected trunk policy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Trunk must be protected.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended rules for <code>main<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">No direct push for most teams\nPull request required\nRequired CI checks\nAt least one approval\nCODEOWNERS for critical paths\nNo force push\nNo branch deletion\nSecret scanning enabled\nLinear history optional\nAdmin bypass audited\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">GitHub documentation says branch protection rules can define whether collaborators can delete or force-push to a branch and can require conditions such as status checks or linear history.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Merge strategy for trunk-based development<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Common merge options:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Merge type<\/th><th>Description<\/th><th>Fit for TBD<\/th><\/tr><\/thead><tbody><tr><td>squash merge<\/td><td>PR becomes one clean commit<\/td><td>excellent default<\/td><\/tr><tr><td>rebase merge<\/td><td>keeps linear history<\/td><td>good for disciplined teams<\/td><\/tr><tr><td>merge commit<\/td><td>preserves branch shape<\/td><td>okay, but noisier<\/td><\/tr><tr><td>fast-forward<\/td><td>pointer moves only<\/td><td>good for direct\/trunk-heavy teams<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended default:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">squash<\/span> <span class=\"hljs-title\">merge<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">normal<\/span> <span class=\"hljs-title\">small<\/span> <span class=\"hljs-title\">PRs<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">rebase<\/span> <span class=\"hljs-title\">merge<\/span> <span class=\"hljs-title\">if<\/span> <span class=\"hljs-title\">commits<\/span> <span class=\"hljs-title\">are<\/span> <span class=\"hljs-title\">clean<\/span>.\n<span class=\"hljs-title\">Avoid<\/span> <span class=\"hljs-title\">noisy<\/span> <span class=\"hljs-title\">merge<\/span> <span class=\"hljs-title\">commits<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">tiny<\/span> <span class=\"hljs-title\">branches<\/span> <span class=\"hljs-title\">unless<\/span> <span class=\"hljs-title\">audit<\/span> <span class=\"hljs-title\">requires<\/span> <span class=\"hljs-title\">them<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Commit message standard<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use meaningful commit messages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">type<\/span>&gt;<\/span>(scope): summary\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">feat(auth)<\/span>: add session renewal flag\n<span class=\"hljs-attribute\">fix(payment)<\/span>: handle gateway timeout\n<span class=\"hljs-attribute\">chore(ci)<\/span>: speed up unit test cache\n<span class=\"hljs-attribute\">docs(runbook)<\/span>: add rollback steps\n<span class=\"hljs-attribute\">test(api)<\/span>: add contract test for vehicle endpoint\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Conventional Commits defines a lightweight structure for commit messages that gives human-readable and machine-readable meaning to history, and aligns with semantic versioning concepts such as features, fixes, and breaking changes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Feature flags: the engine of trunk-based development<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Feature flags let teams merge incomplete or risky work into trunk safely.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without feature flags:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Feature incomplete \u2192 keep branch open\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">With feature flags:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Feature incomplete \u2192 merge to trunk <span class=\"hljs-keyword\">with<\/span> flag OFF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Martin Fowler\u2019s feature toggle article explains that release toggles allow in-progress features to be checked into a shared integration branch while keeping that branch deployable to production.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Code feature]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Wrap with feature flag]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Merge to trunk]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Deploy with flag OFF]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Enable for internal users]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Enable for beta users]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Enable for 10%]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Enable for 100%]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Remove flag]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Feature flag types<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Flag type<\/th><th>Purpose<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>release flag<\/td><td>hide incomplete feature<\/td><td><code>new_checkout_enabled<\/code><\/td><\/tr><tr><td>ops flag<\/td><td>kill switch<\/td><td><code>payment_retry_enabled<\/code><\/td><\/tr><tr><td>experiment flag<\/td><td>A\/B test<\/td><td><code>homepage_variant_b<\/code><\/td><\/tr><tr><td>permission flag<\/td><td>customer\/role control<\/td><td><code>premium_reports_enabled<\/code><\/td><\/tr><tr><td>migration flag<\/td><td>gradual backend switch<\/td><td><code>use_new_search_index<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Martin Fowler\u2019s feature-flag taxonomy discusses release toggles, experiment toggles, ops toggles, and permissioning toggles as different uses of feature flags.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">26. Feature flag rules<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Every flag must have:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metadata<\/th><th>Example<\/th><\/tr><\/thead><tbody><tr><td>owner<\/td><td>payments team<\/td><\/tr><tr><td>creation date<\/td><td>2026-07-07<\/td><\/tr><tr><td>expiry date<\/td><td>2026-08-07<\/td><\/tr><tr><td>default state<\/td><td>off<\/td><\/tr><tr><td>rollout plan<\/td><td>internal \u2192 10% \u2192 50% \u2192 100%<\/td><\/tr><tr><td>rollback action<\/td><td>disable flag<\/td><\/tr><tr><td>cleanup ticket<\/td><td>remove after rollout<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Flag hygiene rule<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">A feature flag without an expiry date is future technical debt.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Atlassian notes that feature flags complement trunk-based development and encourage small-batch updates by allowing inactive code paths to be activated later.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Branch by abstraction<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Branch by abstraction is how teams do large changes without long-lived branches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of building a giant feature branch for months, you introduce an abstraction and migrate gradually.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Old implementation]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Create abstraction\/interface]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Route old behavior through abstraction]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Add new implementation behind flag]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Migrate callers gradually]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Remove old implementation]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">OldPaymentClient\n       \u2193\nPaymentProvider interface\n       \u2193\nStripeProvider + NewProvider\n       \u2193\nflag: use_new_payment_provider\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">PR sequence<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">PR <span class=\"hljs-number\">1<\/span>: add PaymentProvider interface\nPR <span class=\"hljs-number\">2<\/span>: route old provider through interface\nPR <span class=\"hljs-number\">3<\/span>: add <span class=\"hljs-keyword\">new<\/span> provider behind flag\nPR <span class=\"hljs-number\">4<\/span>: migrate one payment path\nPR <span class=\"hljs-number\">5<\/span>: migrate all paths\nPR <span class=\"hljs-number\">6<\/span>: remove old provider and flag\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is one of the most powerful advanced techniques in trunk-based development.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. Expand-migrate-contract for databases<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Database changes are dangerous in trunk-based development unless phased.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Expand \u2192 Migrate \u2192 Contract\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Expand schema]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Deploy backward-compatible app]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Backfill data]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Switch reads\/writes]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Contract old schema]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Bad migration<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">ALTER TABLE users DROP COLUMN name;\n<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Safer migration<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-number\">1.<\/span> Add <span class=\"hljs-keyword\">new<\/span> column.\n<span class=\"hljs-number\">2.<\/span> Deploy app that writes both old <span class=\"hljs-keyword\">and<\/span> <span class=\"hljs-keyword\">new<\/span>.\n<span class=\"hljs-number\">3.<\/span> Backfill data.\n<span class=\"hljs-number\">4.<\/span> <span class=\"hljs-keyword\">Switch<\/span> reads to <span class=\"hljs-keyword\">new<\/span> column.\n<span class=\"hljs-number\">5.<\/span> Wait <span class=\"hljs-keyword\">and<\/span> monitor.\n<span class=\"hljs-number\">6.<\/span> Remove old column later.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Rule<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Trunk must support safe rolling deployment.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That means new code and old code may run together during rollout.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">29. Release from trunk<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In trunk-based development, releases usually come from trunk.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;main\/trunk]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Build artifact]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Deploy to staging]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Deploy to production]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Release using flag or rollout]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Common release models:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Model<\/th><th>How it works<\/th><\/tr><\/thead><tbody><tr><td>deploy every merge<\/td><td>every green main commit deploys<\/td><\/tr><tr><td>scheduled deploy from trunk<\/td><td>deploy selected trunk build<\/td><\/tr><tr><td>release tag from trunk<\/td><td>tag known-good commit<\/td><\/tr><tr><td>release branch from trunk<\/td><td>short stabilization branch<\/td><\/tr><tr><td>feature flag release<\/td><td>deploy code, release later<\/td><\/tr><tr><td>progressive delivery<\/td><td>canary\/blue-green\/rolling<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. Release branches in trunk-based development<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development tries to avoid long-lived development branches, but short-lived release branches can still exist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use release branches when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>mobile app store approval is needed<\/li>\n\n\n\n<li>enterprise release certification is needed<\/li>\n\n\n\n<li>a release needs short stabilization<\/li>\n\n\n\n<li>production patching must happen separately<\/li>\n\n\n\n<li>customers need supported old versions<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Do not use release branches as hidden feature branches.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">gitGraph\n    commit id: <span class=\"hljs-string\">\"A\"<\/span>\n    commit id: <span class=\"hljs-string\">\"B\"<\/span>\n    branch release\/<span class=\"hljs-number\">2.4<\/span>\n    checkout release\/<span class=\"hljs-number\">2.4<\/span>\n    commit id: <span class=\"hljs-string\">\"release fix\"<\/span>\n    checkout main\n    commit id: <span class=\"hljs-string\">\"future work\"<\/span>\n    checkout release\/<span class=\"hljs-number\">2.4<\/span>\n    commit id: <span class=\"hljs-string\">\"tag v2.4.0\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Microsoft describes using trunk-based branching together with a release branch flow model to develop products quickly, deploy regularly, and deliver changes safely to production.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. Release branch rules<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If you use release branches with trunk-based development:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Allowed:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">bug fixes\nversion bump\nrelease notes\nstabilization fixes\nsafe configuration corrections\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Not allowed:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">new<\/span> features\nbig refactors\nexperimental dependency upgrades\nunrelated cleanup\narchitecture rewrites\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Rule:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Release branches stabilize; trunk continues.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">32. Hotfixes in trunk-based development<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Hotfix strategies:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Situation<\/th><th>Best action<\/th><\/tr><\/thead><tbody><tr><td>bad feature behind flag<\/td><td>disable flag<\/td><\/tr><tr><td>bad commit on trunk<\/td><td>revert commit<\/td><\/tr><tr><td>urgent production bug<\/td><td>fix on trunk, deploy<\/td><\/tr><tr><td>release branch active<\/td><td>fix trunk and cherry-pick\/backport<\/td><\/tr><tr><td>old version affected<\/td><td>patch support\/release branch<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Production issue] --&gt; B{Feature flag?}\n    B -- Yes --&gt; C&#91;Disable flag]\n    B -- No --&gt; D{Bad commit?}\n    D -- Yes --&gt; E&#91;Revert on trunk]\n    D -- No --&gt; F&#91;Small hotfix to trunk]\n    F --&gt; G&#91;CI]\n    G --&gt; H&#91;Deploy]\n    E --&gt; H\n    C --&gt; I&#91;Monitor]\n    H --&gt; I\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">33. Rollback strategy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In trunk-based development, rollback must be boring.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rollback methods:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Method<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>disable feature flag<\/td><td>bad feature behavior<\/td><\/tr><tr><td>revert commit<\/td><td>bad source change<\/td><\/tr><tr><td>redeploy previous artifact<\/td><td>bad deployment<\/td><\/tr><tr><td>rollback config<\/td><td>bad configuration<\/td><\/tr><tr><td>pause rollout<\/td><td>canary\/rolling issue<\/td><\/tr><tr><td>fix forward<\/td><td>tiny safe correction<\/td><\/tr><tr><td>restore backup<\/td><td>data loss\/corruption<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">flowchart TD\n    A&#91;Issue detected] --&gt; B{Can flag disable?}\n    B -- Yes --&gt; C&#91;Turn flag off]\n    B -- No --&gt; D{Previous artifact known?}\n    D -- Yes --&gt; E&#91;Redeploy previous artifact]\n    D -- No --&gt; F{Bad commit known?}\n    F -- Yes --&gt; G&#91;Revert commit]\n    F -- No --&gt; H&#91;Fix forward]\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">34. Progressive delivery<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Progressive delivery is a natural partner for trunk-based development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Strategies:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>rolling deployment<\/li>\n\n\n\n<li>canary deployment<\/li>\n\n\n\n<li>blue-green deployment<\/li>\n\n\n\n<li>feature flag rollout<\/li>\n\n\n\n<li>shadow traffic<\/li>\n\n\n\n<li>A\/B testing<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes rolling updates gradually replace old Pods with new Pods and can keep an application available by routing traffic only to Pods that can serve requests.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Deploy v2 to 1%]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Check metrics]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Deploy to 10%]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Check metrics]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Deploy to 50%]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Check metrics]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Deploy to 100%]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Canary gates<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metric<\/th><th>Watch for<\/th><\/tr><\/thead><tbody><tr><td>error rate<\/td><td>increase<\/td><\/tr><tr><td>latency<\/td><td>regression<\/td><\/tr><tr><td>CPU\/memory<\/td><td>saturation<\/td><\/tr><tr><td>logs<\/td><td>new exceptions<\/td><\/tr><tr><td>traces<\/td><td>slow spans<\/td><\/tr><tr><td>business metric<\/td><td>conversion\/login\/payment drop<\/td><\/tr><tr><td>user reports<\/td><td>complaints<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">35. Trunk-based development and continuous delivery<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development is one of the strongest foundations for continuous delivery.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Why?<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Continuous delivery needs releasable code.\nReleasable code needs frequent integration.\nFrequent integration needs trunk-based development discipline.\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Small changes]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Frequent integration]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Fast CI]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Always releasable trunk]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Continuous delivery]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Fast feedback]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">AWS\u2019s Git branching guidance describes trunk-based development as keeping the codebase continuously releasable by integrating changes frequently and relying on automated testing and continuous integration.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">36. Trunk-based development for small teams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Small team model:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nshort-lived\/*\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Rules:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>pair review or PR review<\/li>\n\n\n\n<li>CI required<\/li>\n\n\n\n<li>small commits<\/li>\n\n\n\n<li>feature flags for incomplete work<\/li>\n\n\n\n<li>deploy frequently<\/li>\n\n\n\n<li>revert quickly<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Developer]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Small change]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;CI]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;main]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Deploy]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Small teams can move very fast with trunk-based development because communication cost is low.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">37. Trunk-based development for larger teams<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Large teams need more control.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nshort-lived feature branches\nCODEOWNERS\npath-based CI\nfeature flags\nrelease tags\nprogressive delivery\n<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Team A change]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;main]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Team B change]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Team C change]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;CI fan-out]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Build affected artifacts]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Deploy safely]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Controls:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CODEOWNERS<\/li>\n\n\n\n<li>branch protection<\/li>\n\n\n\n<li>required checks<\/li>\n\n\n\n<li>selective CI<\/li>\n\n\n\n<li>service ownership<\/li>\n\n\n\n<li>feature flag ownership<\/li>\n\n\n\n<li>release dashboards<\/li>\n\n\n\n<li>on-call ownership<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">38. Trunk-based development in monorepos<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development works very well in monorepos, but only with tooling.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Monorepo structure:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">repo\/\n  apps\/\n    web\/\n    admin\/\n  services\/\n    auth\/\n    payment\/\n    notification\/\n  packages\/\n    common\/\n    ui\/\n  infra\/\n  docs\/\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Needs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>path-based CI<\/li>\n\n\n\n<li>affected-project detection<\/li>\n\n\n\n<li>CODEOWNERS<\/li>\n\n\n\n<li>dependency graph<\/li>\n\n\n\n<li>caching<\/li>\n\n\n\n<li>small PRs<\/li>\n\n\n\n<li>feature flags<\/li>\n\n\n\n<li>fast revert<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Commit to main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Detect changed paths]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Find affected services\/packages]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Run targeted tests]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Build affected artifacts]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Deploy only affected services]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">39. Trunk-based development for microservices<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Microservices need independent deployability.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do not use branches to coordinate service compatibility.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>backward-compatible APIs<\/li>\n\n\n\n<li>contract tests<\/li>\n\n\n\n<li>feature flags<\/li>\n\n\n\n<li>versioned endpoints<\/li>\n\n\n\n<li>tolerant readers<\/li>\n\n\n\n<li>gradual rollout<\/li>\n\n\n\n<li>observability<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Service A change]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Backward-compatible API]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Contract tests]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Merge to trunk]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Deploy Service A]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Monitor Service B\/C consumers]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">service-a waits for service-b branch\nservice-b waits for service-c branch\neverything waits for release day\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That is distributed merge hell with extra steps.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">40. Trunk-based development for Infrastructure as Code<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">IaC repositories can use trunk-based development, but with strong plan review.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nshort-lived\/*\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Workflow:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Small infra change]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;PR to main]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;terraform fmt]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;terraform validate]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;terraform plan]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;security scan]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;cost\/blast-radius review]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;merge to main]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;apply through pipeline]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Rules:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>no direct prod apply from laptop<\/li>\n\n\n\n<li>plan output required<\/li>\n\n\n\n<li>cost\/security review for risky changes<\/li>\n\n\n\n<li>production approval where needed<\/li>\n\n\n\n<li>state protected<\/li>\n\n\n\n<li>secrets never committed<\/li>\n\n\n\n<li>small changes only<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">41. Trunk-based development for Kubernetes GitOps<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">GitOps plus trunk-based development is a strong combination.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nshort-lived\/*\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Repository layout:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">gitops\/\n  apps\/\n    auth\/\n    payment\/\n  clusters\/\n    dev\/\n    staging\/\n    production\/\n  platform\/\n    ingress\/\n    monitoring\/\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Flow:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">LR<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;App source merged to main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Build image]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Update GitOps repo]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;PR to main]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Argo CD \/ Flux sync]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Kubernetes cluster]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Rules:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Git is desired state.<\/li>\n\n\n\n<li>Changes go through PR.<\/li>\n\n\n\n<li>Production changes are reviewed.<\/li>\n\n\n\n<li>Rollback is Git revert or previous artifact.<\/li>\n\n\n\n<li>Use immutable image tags\/digests.<\/li>\n\n\n\n<li>Build once, promote same artifact.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">42. Trunk-based development for mobile apps<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Mobile apps often need release branches even if development is trunk-based.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nshort-lived\/*\nrelease\/ios-5.1.0\nrelease\/android-5.1.0\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Flow:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;main]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;release\/mobile-5.1.0]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;QA]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;TestFlight\/Internal track]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;App Store\/Play review]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Staged rollout]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;tag v5.1.0]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Rules:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>trunk continues normal development<\/li>\n\n\n\n<li>release branch gets stabilization fixes only<\/li>\n\n\n\n<li>tags match shipped builds<\/li>\n\n\n\n<li>backend APIs remain backward compatible<\/li>\n\n\n\n<li>use remote config\/feature flags carefully<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">43. Trunk-based development for libraries and SDKs<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Libraries can use trunk-based development with release tags and support branches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">main\nshort-lived\/*\nrelease\/* optional\nsupport\/* optional\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Rules:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>main contains latest development<\/li>\n\n\n\n<li>tag every release<\/li>\n\n\n\n<li>use Semantic Versioning<\/li>\n\n\n\n<li>backport critical fixes if supporting old versions<\/li>\n\n\n\n<li>use release branches only when stabilization is needed<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">44. Trunk-based development and semantic versioning<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development does not remove versioning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use tags:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.1<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<span class=\"hljs-selector-tag\">v1<\/span><span class=\"hljs-selector-class\">.1<\/span><span class=\"hljs-selector-class\">.1<\/span>\n<span class=\"hljs-selector-tag\">v2<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Common mapping:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Change<\/th><th>Version impact<\/th><\/tr><\/thead><tbody><tr><td>bug fix<\/td><td>patch<\/td><\/tr><tr><td>backward-compatible feature<\/td><td>minor<\/td><\/tr><tr><td>breaking change<\/td><td>major<\/td><\/tr><tr><td>internal refactor<\/td><td>no public version change<\/td><\/tr><tr><td>security fix<\/td><td>patch or major depending compatibility<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">45. Trunk-based development PR template<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">## Summary<\/span>\n\nExplain the change in <span class=\"hljs-number\">2<\/span>\u2013<span class=\"hljs-number\">5<\/span> lines.\n\n<span class=\"hljs-comment\">## Why<\/span>\n\nWhat problem does this solve?\n\n<span class=\"hljs-comment\">## Scope<\/span>\n\n- &#91; ] Small isolated change\n- &#91; ] Behind feature flag\n- &#91; ] Refactor only\n- &#91; ] Bug fix\n- &#91; ] Infrastructure\/config change\n\n<span class=\"hljs-comment\">## Testing<\/span>\n\n- &#91; ] Unit tests\n- &#91; ] Integration tests\n- &#91; ] Contract tests\n- &#91; ] Manual validation\n- &#91; ] Not applicable\n\n<span class=\"hljs-comment\">## Risk<\/span>\n\nLow \/ Medium \/ High\n\n<span class=\"hljs-comment\">## Feature flag<\/span>\n\nFlag name:\n<span class=\"hljs-keyword\">Default<\/span> state:\nRollout plan:\nCleanup ticket:\n\n<span class=\"hljs-comment\">## Rollback<\/span>\n\nHow can this be reverted, disabled, <span class=\"hljs-keyword\">or<\/span> rolled back?\n\n<span class=\"hljs-comment\">## Checklist<\/span>\n\n- &#91; ] CI passes\n- &#91; ] Change is small\n- &#91; ] No secrets committed\n- &#91; ] Backward compatibility considered\n- &#91; ] Observability considered\n- &#91; ] Rollback path known\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">46. Company-ready trunk-based policy<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Trunk-Based Development Policy\n\n<span class=\"hljs-number\">1.<\/span> main is the single shared trunk.\n<span class=\"hljs-number\">2.<\/span> main must always remain healthy and releasable.\n<span class=\"hljs-number\">3.<\/span> Long-lived feature branches are not allowed.\n<span class=\"hljs-number\">4.<\/span> Developers must use small changes and short-lived branches.\n<span class=\"hljs-number\">5.<\/span> Branches should merge within hours or a few days.\n<span class=\"hljs-number\">6.<\/span> All changes must pass CI before merge.\n<span class=\"hljs-number\">7.<\/span> Pull requests must be small and reviewable.\n<span class=\"hljs-number\">8.<\/span> Incomplete features must be hidden behind feature flags.\n<span class=\"hljs-number\">9.<\/span> Feature flags must have owners and expiry dates.\n<span class=\"hljs-number\">10.<\/span> Production releases must be traceable to commits and artifacts.\n<span class=\"hljs-number\">11.<\/span> Rollback must be possible through flag disablement, revert, or redeploy.\n<span class=\"hljs-number\">12.<\/span> CI\/CD pipeline changes <span class=\"hljs-built_in\">require<\/span> owner review.\n<span class=\"hljs-number\">13.<\/span> Database changes must be backward compatible.\n<span class=\"hljs-number\">14.<\/span> Stale branches must be deleted.\n<span class=\"hljs-number\">15.<\/span> Trunk health is a team responsibility.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">47. Branch protection policy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For <code>main<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">- <span class=\"hljs-built_in\">require<\/span> pull request\n- <span class=\"hljs-built_in\">require<\/span> status checks\n- <span class=\"hljs-built_in\">require<\/span> one or more approvals\n- <span class=\"hljs-built_in\">require<\/span> CODEOWNERS <span class=\"hljs-keyword\">for<\/span> critical paths\n- block force push\n- block deletion\n- <span class=\"hljs-built_in\">require<\/span> branch to be up to date before merge\n- <span class=\"hljs-built_in\">require<\/span> secret scanning\n- optionally <span class=\"hljs-built_in\">require<\/span> signed commits\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For <code>short-lived\/*<\/code> branches:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">- owner can push\n- CI runs automatically\n- PR required before merge\n- <span class=\"hljs-keyword\">delete<\/span> after merge\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">48. CODEOWNERS example<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Platform and CI\/CD<\/span>\n\/.github\/workflows\/ @devops-team\n\/infra\/ @platform-team\n\n<span class=\"hljs-comment\"># Services<\/span>\n\/services\/auth\/ @identity-team\n\/services\/payment\/ @payment-team\n\/services\/notification\/ @backend-team\n\n<span class=\"hljs-comment\"># Sensitive areas<\/span>\n\/security\/ @security-team\n\/database\/migrations\/ @backend-leads @platform-team\n\n<span class=\"hljs-comment\"># Shared libraries<\/span>\n\/packages\/common\/ @architecture-team\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">49. Developer daily checklist<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Before opening PR:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">- Branch is based on latest main.\n- Change is small.\n- Tests are added or updated.\n- Local checks pass.\n- Feature flag exists if feature is incomplete.\n- Rollback path is clear.\n- No secrets are committed.\n- PR description explains why.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Before merging:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">- CI is green.\n- Review is complete.\n- Risk is understood.\n- Main is healthy.\n- Feature flag <span class=\"hljs-keyword\">default<\/span> is safe.\n- Monitoring exists <span class=\"hljs-keyword\">if<\/span> production behavior changes.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">50. Reviewer checklist<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Reviewers should check:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Is this change small enough?<\/li>\n\n\n\n<li>Does it belong on trunk now?<\/li>\n\n\n\n<li>Is incomplete work hidden?<\/li>\n\n\n\n<li>Are tests adequate?<\/li>\n\n\n\n<li>Is it backward compatible?<\/li>\n\n\n\n<li>Is rollback possible?<\/li>\n\n\n\n<li>Is the feature flag safe?<\/li>\n\n\n\n<li>Is observability adequate?<\/li>\n\n\n\n<li>Does it affect database schema?<\/li>\n\n\n\n<li>Does it affect deployment or security?<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">51. Release checklist<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Before production rollout:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">- Artifact built <span class=\"hljs-keyword\">from<\/span> main.\n- Commit SHA known.\n- CI passed.\n- Security scans passed.\n- Feature flags configured.\n- Database migrations safe.\n- Rollback plan ready.\n- Dashboard ready.\n- Alerts active.\n- On-call owner aware.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">After rollout:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">- Monitor errors.\n- Monitor latency.\n- Monitor business metric.\n- <span class=\"hljs-keyword\">Continue<\/span>\/pause rollout.\n- Remove old feature flags after success.\n- Document incident <span class=\"hljs-keyword\">if<\/span> rollback was needed.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">52. Migration path from Gitflow to trunk-based development<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Many teams cannot jump directly from Gitflow to trunk-based development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use a gradual migration.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">flowchart<\/span> <span class=\"hljs-selector-tag\">TD<\/span>\n    <span class=\"hljs-selector-tag\">A<\/span><span class=\"hljs-selector-attr\">&#91;Current Gitflow]<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">B<\/span><span class=\"hljs-selector-attr\">&#91;Protect develop\/main]<\/span>\n    <span class=\"hljs-selector-tag\">B<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">C<\/span><span class=\"hljs-selector-attr\">&#91;Reduce feature branch lifetime]<\/span>\n    <span class=\"hljs-selector-tag\">C<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">D<\/span><span class=\"hljs-selector-attr\">&#91;Improve CI speed]<\/span>\n    <span class=\"hljs-selector-tag\">D<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">E<\/span><span class=\"hljs-selector-attr\">&#91;Introduce feature flags]<\/span>\n    <span class=\"hljs-selector-tag\">E<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">F<\/span><span class=\"hljs-selector-attr\">&#91;Merge features to develop daily]<\/span>\n    <span class=\"hljs-selector-tag\">F<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">G<\/span><span class=\"hljs-selector-attr\">&#91;Remove long-lived develop dependency]<\/span>\n    <span class=\"hljs-selector-tag\">G<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">H<\/span><span class=\"hljs-selector-attr\">&#91;Make main the trunk]<\/span>\n    <span class=\"hljs-selector-tag\">H<\/span> <span class=\"hljs-selector-tag\">--<\/span>&gt; <span class=\"hljs-selector-tag\">I<\/span><span class=\"hljs-selector-attr\">&#91;Release from main]<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step-by-step<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Step<\/th><th>Action<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>measure current branch age<\/td><\/tr><tr><td>2<\/td><td>limit feature branches to under one week<\/td><\/tr><tr><td>3<\/td><td>require CI on PRs<\/td><\/tr><tr><td>4<\/td><td>add feature flags<\/td><\/tr><tr><td>5<\/td><td>split large PRs<\/td><\/tr><tr><td>6<\/td><td>make <code>develop<\/code> always green<\/td><\/tr><tr><td>7<\/td><td>merge more frequently<\/td><\/tr><tr><td>8<\/td><td>move toward <code>main<\/code> as trunk<\/td><\/tr><tr><td>9<\/td><td>use release branches only when needed<\/td><\/tr><tr><td>10<\/td><td>delete stale branches<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">53. Readiness checklist<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You are ready for trunk-based development when:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">- CI is reliable.\n- CI is fast enough.\n- Tests <span class=\"hljs-keyword\">catch<\/span> important failures.\n- Developers can make small PRs.\n- Feature flags are available.\n- Main branch is <span class=\"hljs-keyword\">protected<\/span>.\n- Rollback is known.\n- Production has observability.\n- Team can review quickly.\n- Database changes are backward compatible.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You are not ready when:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">- CI is flaky.\n- Tests are weak.\n- PRs are huge.\n- Developers keep branches for weeks.\n- No feature flag system exists.\n- Main breaks often.\n- Rollback is manual panic.\n- Production monitoring is weak.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">54. Trunk-based anti-patterns<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 1: Everyone pushes broken code to main<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">That is not trunk-based development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">protect main\n<span class=\"hljs-built_in\">require<\/span> CI\n<span class=\"hljs-built_in\">require<\/span> review or pair programming\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 2: Short-lived branches become long-lived branches<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">feature\/big-refactor lives for 6 weeks\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">split work\n<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">feature<\/span> <span class=\"hljs-title\">flags<\/span>\n<span class=\"hljs-title\">use<\/span> <span class=\"hljs-title\">branch<\/span> <span class=\"hljs-title\">by<\/span> <span class=\"hljs-title\">abstraction<\/span>\n<span class=\"hljs-title\">merge<\/span> <span class=\"hljs-title\">small<\/span> <span class=\"hljs-title\">slices<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 3: Feature flags never get removed<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">hundreds of flags\nnobody knows which are active\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">owner\nexpiry date\ncleanup ticket\nflag dashboard\nregular cleanup\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 4: CI is too slow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">developers batch changes because feedback takes too long\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">parallelize tests\ncache dependencies\nsplit fast and deep CI\nrun targeted tests\nremove flaky tests <span class=\"hljs-keyword\">from<\/span> merge gate only <span class=\"hljs-keyword\">with<\/span> owner\/deadline\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 5: Big bang release from trunk<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">many hidden features enabled at once\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">progressive rollout\ncanary\nfeature flags\nsmall releases\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Anti-pattern 6: Database changes break rolling deploys<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Problem:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">new<\/span> code requires <span class=\"hljs-keyword\">new<\/span> schema immediately\nold pods still running\ndeployment fails\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Fix:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">expand-migrate-contract\nbackward-compatible migrations\nsafe rollout\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">55. Trunk-based development metrics<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Measure the system.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metric<\/th><th>Why it matters<\/th><\/tr><\/thead><tbody><tr><td>branch age<\/td><td>integration delay<\/td><\/tr><tr><td>PR size<\/td><td>review quality<\/td><\/tr><tr><td>PR cycle time<\/td><td>flow speed<\/td><\/tr><tr><td>CI duration<\/td><td>feedback speed<\/td><\/tr><tr><td>CI failure rate<\/td><td>quality signal<\/td><\/tr><tr><td>flaky test rate<\/td><td>pipeline trust<\/td><\/tr><tr><td>main branch health<\/td><td>trunk stability<\/td><\/tr><tr><td>deployment frequency<\/td><td>delivery flow<\/td><\/tr><tr><td>change failure rate<\/td><td>production risk<\/td><\/tr><tr><td>rollback time<\/td><td>recovery strength<\/td><\/tr><tr><td>feature flag age<\/td><td>flag debt<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Healthy signals:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">branches live hours\/days\nPRs are small\nmain is usually green\nCI is trusted\nrollbacks are fast\nfeature flags are removed\ndeployments are routine\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">56. Practical examples<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Example 1: small bug fix<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">git checkout main\ngit pull --ff-only origin main\ngit checkout -b bugfix\/clear-login-error\n\n<span class=\"hljs-comment\"># edit<\/span>\nmake test\n\ngit add .\ngit commit -m <span class=\"hljs-string\">\"fix(auth): show clear login error\"<\/span>\ngit push -u origin bugfix\/clear-login-error\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Merge same day.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Example 2: incomplete feature with flag<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">git checkout main\ngit pull --ff-only origin main\ngit checkout -b feature\/payment-retry-flag\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">if<\/span> payment_retry_enabled:\n    retry_gateway_timeout()\n<span class=\"hljs-keyword\">else<\/span>:\n    current_payment_flow()\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Commit:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">git commit -m <span class=\"hljs-string\">\"feat(payment): add retry flow behind feature flag\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Deploy with flag off. Enable gradually later.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Example 3: large refactor using branch by abstraction<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">PR <span class=\"hljs-number\">1<\/span>: introduce interface\nPR <span class=\"hljs-number\">2<\/span>: route old implementation through interface\nPR <span class=\"hljs-number\">3<\/span>: add <span class=\"hljs-keyword\">new<\/span> implementation behind flag\nPR <span class=\"hljs-number\">4<\/span>: migrate one caller\nPR <span class=\"hljs-number\">5<\/span>: migrate remaining callers\nPR <span class=\"hljs-number\">6<\/span>: remove old implementation\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">No giant branch. No merge war. No \u201csee you in six weeks\u201d energy.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">57. Trunk-based development for teams: operating model<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Developer<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>makes small changes<\/li>\n\n\n\n<li>keeps branch fresh<\/li>\n\n\n\n<li>writes tests<\/li>\n\n\n\n<li>uses feature flags<\/li>\n\n\n\n<li>opens small PRs<\/li>\n\n\n\n<li>merges quickly<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Reviewer<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>reviews quickly<\/li>\n\n\n\n<li>focuses on correctness\/risk<\/li>\n\n\n\n<li>encourages smaller PRs<\/li>\n\n\n\n<li>checks rollback<\/li>\n\n\n\n<li>blocks unsafe trunk changes<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Tech lead<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>watches trunk health<\/li>\n\n\n\n<li>splits large work<\/li>\n\n\n\n<li>enforces flag cleanup<\/li>\n\n\n\n<li>improves CI reliability<\/li>\n\n\n\n<li>guides migration patterns<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">DevOps\/platform<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>keeps CI fast<\/li>\n\n\n\n<li>enforces branch protection<\/li>\n\n\n\n<li>provides deployment safety<\/li>\n\n\n\n<li>enables observability<\/li>\n\n\n\n<li>automates rollback<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Product<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>accepts incremental delivery<\/li>\n\n\n\n<li>uses feature flags for release timing<\/li>\n\n\n\n<li>avoids forcing giant branches<\/li>\n\n\n\n<li>helps define rollout phases<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">58. Trunk-based development decision tree<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">flowchart TD\n    A&#91;Should we <span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">trunk<\/span>-<span class=\"hljs-title\">based<\/span> <span class=\"hljs-title\">development<\/span>?] --&gt; <span class=\"hljs-title\">B<\/span>{<span class=\"hljs-title\">Can<\/span> <span class=\"hljs-title\">main<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">protected<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">kept<\/span> <span class=\"hljs-title\">green<\/span>?}\n    <span class=\"hljs-title\">B<\/span> -- <span class=\"hljs-title\">No<\/span> --&gt; <span class=\"hljs-title\">C<\/span>&#91;<span class=\"hljs-title\">Improve<\/span> <span class=\"hljs-title\">CI<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">branch<\/span> <span class=\"hljs-title\">protection<\/span> <span class=\"hljs-title\">first<\/span>]\n    <span class=\"hljs-title\">B<\/span> -- <span class=\"hljs-title\">Yes<\/span> --&gt; <span class=\"hljs-title\">D<\/span>{<span class=\"hljs-title\">Can<\/span> <span class=\"hljs-title\">changes<\/span> <span class=\"hljs-title\">be<\/span> <span class=\"hljs-title\">small<\/span>?}\n    <span class=\"hljs-title\">D<\/span> -- <span class=\"hljs-title\">No<\/span> --&gt; <span class=\"hljs-title\">E<\/span>&#91;<span class=\"hljs-title\">Introduce<\/span> <span class=\"hljs-title\">slicing<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">branch<\/span> <span class=\"hljs-title\">by<\/span> <span class=\"hljs-title\">abstraction<\/span>]\n    <span class=\"hljs-title\">D<\/span> -- <span class=\"hljs-title\">Yes<\/span> --&gt; <span class=\"hljs-title\">F<\/span>{<span class=\"hljs-title\">Do<\/span> <span class=\"hljs-title\">we<\/span> <span class=\"hljs-title\">have<\/span> <span class=\"hljs-title\">feature<\/span> <span class=\"hljs-title\">flags<\/span>?}\n    <span class=\"hljs-title\">F<\/span> -- <span class=\"hljs-title\">No<\/span> --&gt; <span class=\"hljs-title\">G<\/span>&#91;<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">short<\/span> <span class=\"hljs-title\">branches<\/span> <span class=\"hljs-title\">carefully<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">add<\/span> <span class=\"hljs-title\">flags<\/span>]\n    <span class=\"hljs-title\">F<\/span> -- <span class=\"hljs-title\">Yes<\/span> --&gt; <span class=\"hljs-title\">H<\/span>{<span class=\"hljs-title\">Can<\/span> <span class=\"hljs-title\">we<\/span> <span class=\"hljs-title\">rollback<\/span> <span class=\"hljs-title\">quickly<\/span>?}\n    <span class=\"hljs-title\">H<\/span> -- <span class=\"hljs-title\">No<\/span> --&gt; <span class=\"hljs-title\">I<\/span>&#91;<span class=\"hljs-title\">Improve<\/span> <span class=\"hljs-title\">rollback<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">observability<\/span>]\n    <span class=\"hljs-title\">H<\/span> -- <span class=\"hljs-title\">Yes<\/span> --&gt; <span class=\"hljs-title\">J<\/span>&#91;<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">trunk<\/span>-<span class=\"hljs-title\">based<\/span> <span class=\"hljs-title\">development<\/span>]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">59. One-page trunk-based standard<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Trunk-Based Development Standard\n\nBranch model:\n- main is the trunk.\n- short-lived branches are allowed.\n- long-lived feature branches are not allowed.\n- release branches are optional and short-lived.\n\nRules:\n- main must always be healthy.\n- all changes are small.\n- all changes pass CI.\n- incomplete features use feature flags.\n- branches merge within hours or days.\n- production releases are traceable.\n- rollback is planned.\n- feature flags are removed after rollout.\n- stale branches are deleted.\n\nMerge policy:\n- squash merge by <span class=\"hljs-keyword\">default<\/span>.\n- rebase local branches only.\n- no force push to main.\n- revert instead <span class=\"hljs-keyword\">of<\/span> rewriting shared history.\n\nRelease policy:\n- build <span class=\"hljs-keyword\">from<\/span> main.\n- promote immutable artifacts.\n- use flags\/canary\/rolling rollout.\n- tag releases when needed.\n- monitor after deployment.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">60. Final wisdom<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A beginner thinks trunk-based development means:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Everyone commits to main.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A senior engineer knows it means:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Everyone integrates safely and frequently.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">An architect knows it means:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">A delivery system built around small changes, fast feedback, automation, feature flags, rollback, and continuous learning.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Trunk-based development is not a shortcut.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is discipline.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It removes branch complexity and replaces it with engineering maturity:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-60\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">small batches\nfast CI\nstrong tests\nfeature flags\n<span class=\"hljs-keyword\">protected<\/span> main\nsafe rollout\nquick rollback\nobservability\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-60\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Final principle:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Trunk-based development is not about having fewer branches.\nIt is about having fewer delayed problems.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When done badly, it breaks main.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When done well, it becomes one of the strongest foundations for continuous delivery.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>From Beginner to Advanced: A Complete One-Stop Guide to Fast, Safe, Continuous Software Delivery 1. What is trunk-based development? Trunk-based development, often shortened as TBD, is a&#8230; <\/p>\n","protected":false},"author":1,"featured_media":77521,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-77520","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77520","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=77520"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77520\/revisions"}],"predecessor-version":[{"id":77522,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/77520\/revisions\/77522"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/77521"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=77520"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=77520"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=77520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}