<div class="chartlet-wrapper"><style>.chartlet-stage{position:relative;display:inline-block;max-width:100%;vertical-align:top}.chartlet-stage>svg{display:block}.chartlet-hotspot{position:absolute;border-radius:8px;cursor:pointer}.chartlet-focus{margin:0 0 12px 0;font-size:13px}.chartlet-focus summary{cursor:pointer;min-height:24px}.chartlet-focus fieldset{border:none;padding:0;margin:4px 0 0 0}.chartlet-focus label{display:inline-flex;align-items:center;min-height:44px;margin-right:14px;cursor:pointer;white-space:nowrap}.chartlet-focus input{margin-right:4px}.chartlet-focus input:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.chartlet-wrapper:has(.chartlet-focus-node:checked) #chartlet-b58962593dd0ee5e .chartlet-f{opacity:.18}#chartlet-b58962593dd0ee5e-hs-0{left:11.429%;top:5.839%;width:11.429%;height:3.65%}#chartlet-b58962593dd0ee5e-hs-1{left:12.5%;top:12.409%;width:9.286%;height:3.65%}#chartlet-b58962593dd0ee5e-hs-2{left:41.429%;top:27.372%;width:10%;height:5.109%}#chartlet-b58962593dd0ee5e-hs-3{left:41.786%;top:36.496%;width:9.286%;height:3.65%}#chartlet-b58962593dd0ee5e-hs-4{left:39.643%;top:44.161%;width:13.571%;height:5.839%}#chartlet-b58962593dd0ee5e-hs-5{left:13.571%;top:62.774%;width:9.286%;height:3.65%}#chartlet-b58962593dd0ee5e-hs-6{left:73.571%;top:62.774%;width:12.857%;height:3.65%}#chartlet-b58962593dd0ee5e-hs-7{left:73.214%;top:73.723%;width:13.571%;height:5.839%}#chartlet-b58962593dd0ee5e-hs-8{left:72.857%;top:85.766%;width:14.286%;height:3.65%}#chartlet-b58962593dd0ee5e-hs-9{left:75.357%;top:92.336%;width:9.286%;height:3.65%}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-0:checked) #chartlet-b58962593dd0ee5e .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-0:checked) #chartlet-b58962593dd0ee5e .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-0:checked) #chartlet-b58962593dd0ee5e .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-1:checked) #chartlet-b58962593dd0ee5e .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-1:checked) #chartlet-b58962593dd0ee5e .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-1:checked) #chartlet-b58962593dd0ee5e .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-2:checked) #chartlet-b58962593dd0ee5e .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-2:checked) #chartlet-b58962593dd0ee5e .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-2:checked) #chartlet-b58962593dd0ee5e .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-3:checked) #chartlet-b58962593dd0ee5e .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-3:checked) #chartlet-b58962593dd0ee5e .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-3:checked) #chartlet-b58962593dd0ee5e .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-4:checked) #chartlet-b58962593dd0ee5e .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-4:checked) #chartlet-b58962593dd0ee5e .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-4:checked) #chartlet-b58962593dd0ee5e .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-5:checked) #chartlet-b58962593dd0ee5e .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-5:checked) #chartlet-b58962593dd0ee5e .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-5:checked) #chartlet-b58962593dd0ee5e .chartlet-n-5 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-6:checked) #chartlet-b58962593dd0ee5e .chartlet-f-6{opacity:1}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-6:checked) #chartlet-b58962593dd0ee5e .chartlet-n-6 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-6:checked) #chartlet-b58962593dd0ee5e .chartlet-n-6 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-7:checked) #chartlet-b58962593dd0ee5e .chartlet-f-7{opacity:1}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-7:checked) #chartlet-b58962593dd0ee5e .chartlet-n-7 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-7:checked) #chartlet-b58962593dd0ee5e .chartlet-n-7 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-8:checked) #chartlet-b58962593dd0ee5e .chartlet-f-8{opacity:1}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-8:checked) #chartlet-b58962593dd0ee5e .chartlet-n-8 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-8:checked) #chartlet-b58962593dd0ee5e .chartlet-n-8 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-9:checked) #chartlet-b58962593dd0ee5e .chartlet-f-9{opacity:1}.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-9:checked) #chartlet-b58962593dd0ee5e .chartlet-n-9 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-b58962593dd0ee5e-focus-9:checked) #chartlet-b58962593dd0ee5e .chartlet-n-9 .chartlet-seq-box{stroke-width:3}</style><details class="chartlet-focus"><summary>Focus</summary><fieldset><label><input type="radio" name="chartlet-b58962593dd0ee5e-focus" checked> Show all</label><label><input type="radio" name="chartlet-b58962593dd0ee5e-focus" class="chartlet-focus-node" id="chartlet-b58962593dd0ee5e-focus-0"> Commit pushed</label><label><input type="radio" name="chartlet-b58962593dd0ee5e-focus" class="chartlet-focus-node" id="chartlet-b58962593dd0ee5e-focus-1"> Code review</label><label><input type="radio" name="chartlet-b58962593dd0ee5e-focus" class="chartlet-focus-node" id="chartlet-b58962593dd0ee5e-focus-2"> Build</label><label><input type="radio" name="chartlet-b58962593dd0ee5e-focus" class="chartlet-focus-node" id="chartlet-b58962593dd0ee5e-focus-3"> Run tests</label><label><input type="radio" name="chartlet-b58962593dd0ee5e-focus" class="chartlet-focus-node" id="chartlet-b58962593dd0ee5e-focus-4"> All green?</label><label><input type="radio" name="chartlet-b58962593dd0ee5e-focus" class="chartlet-focus-node" id="chartlet-b58962593dd0ee5e-focus-5"> Fix failures</label><label><input type="radio" name="chartlet-b58962593dd0ee5e-focus" class="chartlet-focus-node" id="chartlet-b58962593dd0ee5e-focus-6"> Deploy to staging</label><label><input type="radio" name="chartlet-b58962593dd0ee5e-focus" class="chartlet-focus-node" id="chartlet-b58962593dd0ee5e-focus-7"> Approved?</label><label><input type="radio" name="chartlet-b58962593dd0ee5e-focus" class="chartlet-focus-node" id="chartlet-b58962593dd0ee5e-focus-8"> Deploy to production</label><label><input type="radio" name="chartlet-b58962593dd0ee5e-focus" class="chartlet-focus-node" id="chartlet-b58962593dd0ee5e-focus-9"> Released</label></fieldset></details><figure class="chartlet-figure" data-viz="chart"><figcaption>From commit to release</figcaption><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="1120" height="1096" viewBox="0 0 1120 1096" id="chartlet-b58962593dd0ee5e" role="img" aria-labelledby="chartlet-b58962593dd0ee5e-title chartlet-b58962593dd0ee5e-description" class="chartlet-root chartlet-look-editorial"><title id="chartlet-b58962593dd0ee5e-title">From commit to release</title><desc id="chartlet-b58962593dd0ee5e-description">Flow chart with 10 steps and 11 connections in 3 lanes: Development, Continuous integration and Operations. Main path: Commit pushed → Code review → Build → Run tests → All green? → Deploy to staging → Approved? → Deploy to production → Released. Loop: Code review → Build → Run tests → All green? → Deploy to staging → Approved? → Code review. Bottleneck: Approved?; without it the diagram falls apart. Commit pushed (start) in Development: leads to Code review. Code review in Development: leads to Build (merged). Build in Continuous integration: leads to Run tests. Run tests in Continuous integration: leads to All green?. All green? (decision) in Continuous integration: leads to Deploy to staging (yes) and Fix failures (no). Fix failures in Development: leads to Build (retry). Deploy to staging in Operations: leads to Approved?. Approved? (decision) in Operations: leads to Deploy to production (yes) and Code review (changes requested). Deploy to production in Operations: leads to Released. Released (end) in Operations: no further step. Group "Quality gates": Build, Run tests, All green?.</desc><style>.chartlet-root{--chartlet-text:#172033;--chartlet-muted:#344054;--chartlet-grid:#d9dee8;--chartlet-zero:#667085;--chartlet-accent:#2563eb;--chartlet-background:#fff;--chartlet-color-1:#2563eb;--chartlet-color-2:#c2410c;--chartlet-color-3:#475569;--chartlet-color-4:#111827;max-width:100%;height:auto;font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:var(--chartlet-text)}#chartlet-b58962593dd0ee5e .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-b58962593dd0ee5e .chartlet-label,#chartlet-b58962593dd0ee5e .chartlet-tick,#chartlet-b58962593dd0ee5e .chartlet-value,#chartlet-b58962593dd0ee5e .chartlet-value-inverse,#chartlet-b58962593dd0ee5e .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-b58962593dd0ee5e .chartlet-value,#chartlet-b58962593dd0ee5e .chartlet-value-inverse{font-weight:600}#chartlet-b58962593dd0ee5e .chartlet-value{fill:var(--chartlet-text)}#chartlet-b58962593dd0ee5e .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-b58962593dd0ee5e .chartlet-axis-title{font-weight:600}#chartlet-b58962593dd0ee5e .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-b58962593dd0ee5e .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-b58962593dd0ee5e .chartlet-bar,#chartlet-b58962593dd0ee5e .chartlet-point{fill:var(--chartlet-accent)}#chartlet-b58962593dd0ee5e .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-b58962593dd0ee5e .chartlet-background{fill:var(--chartlet-background)}.chartlet-root{--chartlet-node:#eef3fd;--chartlet-lane:#f7f9fc;--chartlet-lane-head:#eef1f6;--chartlet-shadow:rgba(16,24,40,.09);--chartlet-role-blue:#2563eb;--chartlet-role-blue-fill:#eef3fd;--chartlet-role-green:#15803d;--chartlet-role-green-fill:#ecfdf3;--chartlet-role-amber:#b45309;--chartlet-role-amber-fill:#fff7e8;--chartlet-role-teal:#0f766e;--chartlet-role-teal-fill:#e9faf7;--chartlet-role-violet:#6d28d9;--chartlet-role-violet-fill:#f3efff;--chartlet-role-gray:#667085;--chartlet-role-gray-fill:#f7f8fa;--chartlet-role-red:#b42318;--chartlet-role-red-fill:#fef3f2}.chartlet-root.chartlet-theme-dark{--chartlet-node:#1a2436;--chartlet-lane:#121925;--chartlet-lane-head:#18212f;--chartlet-shadow:rgba(0,0,0,.45);--chartlet-role-blue:#7ea6ff;--chartlet-role-blue-fill:#1a2436;--chartlet-role-green:#4ade80;--chartlet-role-green-fill:#132a1d;--chartlet-role-amber:#fbbf24;--chartlet-role-amber-fill:#2b2210;--chartlet-role-teal:#2dd4bf;--chartlet-role-teal-fill:#0f2a27;--chartlet-role-violet:#b69cff;--chartlet-role-violet-fill:#231c38;--chartlet-role-gray:#9aa7bd;--chartlet-role-gray-fill:#161d29;--chartlet-role-red:#f97066;--chartlet-role-red-fill:#2d1616}#chartlet-b58962593dd0ee5e .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-b58962593dd0ee5e .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-b58962593dd0ee5e .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-b58962593dd0ee5e .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-b58962593dd0ee5e .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-b58962593dd0ee5e .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-b58962593dd0ee5e .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-b58962593dd0ee5e .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-b58962593dd0ee5e .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-b58962593dd0ee5e .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-b58962593dd0ee5e .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-b58962593dd0ee5e .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-b58962593dd0ee5e .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-b58962593dd0ee5e .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-b58962593dd0ee5e .chartlet-flow-start{stroke-width:2}#chartlet-b58962593dd0ee5e .chartlet-flow-end{stroke-width:3}#chartlet-b58962593dd0ee5e .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-b58962593dd0ee5e .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-b58962593dd0ee5e .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-b58962593dd0ee5e .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-b58962593dd0ee5e .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-b58962593dd0ee5e .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-b58962593dd0ee5e .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-b58962593dd0ee5e .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-b58962593dd0ee5e .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-b58962593dd0ee5e .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-b58962593dd0ee5e .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-b58962593dd0ee5e .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-b58962593dd0ee5e .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-b58962593dd0ee5e .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-b58962593dd0ee5e .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-b58962593dd0ee5e .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}.chartlet-root.chartlet-look-editorial{--chartlet-text:#1d1c1a;--chartlet-muted:#4d4a44;--chartlet-grid:#d8d4ca;--chartlet-zero:#6b665c;--chartlet-accent:#0b6a88;--chartlet-background:#fcfbf8;--chartlet-color-1:#0b6a88;--chartlet-color-2:#a8431a;--chartlet-color-3:#6b665c;--chartlet-color-4:#1d1c1a;--chartlet-node:#f2efe8;--chartlet-lane:#fcfbf8;--chartlet-lane-head:#f2efe8;--chartlet-shadow:rgba(0,0,0,0);--chartlet-role-blue:#6b665c;--chartlet-role-blue-fill:#f2efe8;--chartlet-role-green:#6b665c;--chartlet-role-green-fill:#f2efe8;--chartlet-role-amber:#6b665c;--chartlet-role-amber-fill:#f2efe8;--chartlet-role-teal:#6b665c;--chartlet-role-teal-fill:#f2efe8;--chartlet-role-violet:#4d4a44;--chartlet-role-violet-fill:#f2efe8;--chartlet-role-gray:#6b665c;--chartlet-role-gray-fill:#f2efe8;--chartlet-role-red:#a8281c;--chartlet-role-red-fill:#fbefec}.chartlet-root.chartlet-look-editorial.chartlet-theme-dark:not(.chartlet-blueprint){--chartlet-text:#ece8df;--chartlet-muted:#b7b2a7;--chartlet-grid:#3a3840;--chartlet-zero:#8f8a80;--chartlet-accent:#62b8d4;--chartlet-background:#17161a;--chartlet-color-1:#62b8d4;--chartlet-color-2:#e0916a;--chartlet-color-3:#9a958a;--chartlet-color-4:#ece8df;--chartlet-node:#222127;--chartlet-lane:#17161a;--chartlet-lane-head:#222127;--chartlet-shadow:rgba(0,0,0,0);--chartlet-role-blue:#8f8a80;--chartlet-role-blue-fill:#222127;--chartlet-role-green:#8f8a80;--chartlet-role-green-fill:#222127;--chartlet-role-amber:#8f8a80;--chartlet-role-amber-fill:#222127;--chartlet-role-teal:#8f8a80;--chartlet-role-teal-fill:#222127;--chartlet-role-violet:#c9c4b8;--chartlet-role-violet-fill:#222127;--chartlet-role-gray:#8f8a80;--chartlet-role-gray-fill:#222127;--chartlet-role-red:#f08a7e;--chartlet-role-red-fill:#2d1f1e}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-role-blue,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-role-green,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-role-amber,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-role-teal,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-role-violet,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-role-gray,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-role-red{fill:var(--chartlet-node);stroke:var(--chartlet-zero)}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-flow-node{stroke-width:1;rx:6px}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-flow-start{stroke-width:1}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-flow-end{stroke-width:2}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-flow-inner{stroke:var(--chartlet-zero)}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-flow-edge{stroke:var(--chartlet-zero);stroke-width:1}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-flow-group{fill:none;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:3 3;rx:8px}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-diagram-shadow{display:none}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:none;rx:2px}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-diagram-badge{fill:var(--chartlet-text);stroke:var(--chartlet-background)}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-diagram-badge-text{fill:var(--chartlet-background)}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-diagram-tag{fill:var(--chartlet-background);stroke:var(--chartlet-zero);stroke-width:1;rx:3px}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-diagram-tech{font-size:11px;fill:var(--chartlet-text)}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-diagram-tag-text{font-size:9px;font-weight:600;letter-spacing:.5px;fill:var(--chartlet-text)}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-seq-box{stroke-width:1;rx:6px}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-seq-message{stroke:var(--chartlet-zero);stroke-width:1}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-seq-activation{stroke:var(--chartlet-zero)}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-seq-frame{rx:8px}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-state{rx:8px}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-state-inner{stroke:var(--chartlet-zero);rx:6px}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-arch-head{fill:var(--chartlet-node);stroke:var(--chartlet-zero)}#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-flow-sublabel,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-flow-group-label,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-flow-card,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-diagram-tag-text,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-diagram-tech,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-arch-interface,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-seq-sublabel,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-seq-tag,#chartlet-b58962593dd0ee5e.chartlet-look-editorial .chartlet-seq-guard{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"JetBrains Mono","DejaVu Sans Mono",monospace}</style><rect x="24" y="20" width="336" height="1048" class="chartlet-flow-lane"/><rect x="24.5" y="20.5" width="335" height="27" class="chartlet-flow-lane-head"/><text x="192" y="37" text-anchor="middle" class="chartlet-flow-lane-label">Development</text><rect x="360" y="20" width="360" height="1048" class="chartlet-flow-lane chartlet-flow-lane-alt"/><rect x="360.5" y="20.5" width="359" height="27" class="chartlet-flow-lane-head"/><text x="540" y="37" text-anchor="middle" class="chartlet-flow-lane-label">Continuous integration</text><rect x="720" y="20" width="368" height="1048" class="chartlet-flow-lane"/><rect x="720.5" y="20.5" width="367" height="27" class="chartlet-flow-lane-head"/><text x="904" y="37" text-anchor="middle" class="chartlet-flow-lane-label">Operations</text><rect x="432" y="272" width="176" height="288" class="chartlet-flow-group"/><text x="440" y="285" text-anchor="start" class="chartlet-flow-group-label">Quality gates</text><g class="chartlet-f chartlet-f-0 chartlet-f-1"><polyline points="192,104 192,128" class="chartlet-flow-edge chartlet-flow-main"><title>Commit pushed → Code review</title></polyline><polyline points="188.5,128 192,136 195.5,128 188.5,128" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><polyline points="192,176 192,239.807 520,239.807 520,292" class="chartlet-flow-edge chartlet-flow-main"><title>Code review → Build: merged</title></polyline><polyline points="516.5,292 520,300 523.5,292 516.5,292" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-3"><polyline points="520,356 520,392" class="chartlet-flow-edge chartlet-flow-main"><title>Build → Run tests</title></polyline><polyline points="516.5,392 520,400 523.5,392 516.5,392" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-4"><polyline points="520,440 520,476" class="chartlet-flow-edge chartlet-flow-main"><title>Run tests → All green?</title></polyline><polyline points="516.5,476 520,484 523.5,476 516.5,476" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-6"><polyline points="520,548 520,623.807 896,623.807 896,680" class="chartlet-flow-edge chartlet-flow-main"><title>All green? → Deploy to staging: yes</title></polyline><polyline points="892.5,680 896,688 899.5,680 892.5,680" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><polyline points="496,537.895 496,624.785 216,624.785 216,680" class="chartlet-flow-edge"><title>All green? → Fix failures: no</title></polyline><polyline points="212.5,680 216,688 219.5,680 212.5,680" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-5"><polyline points="192,688 192,611.807 256,611.807 256,373.304 496,373.304 496,364" class="chartlet-flow-edge"><title>Fix failures → Build: retry</title></polyline><polyline points="499.5,364 496,356 492.5,364 499.5,364" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-6 chartlet-f-7"><polyline points="896,728 896,800" class="chartlet-flow-edge chartlet-flow-main"><title>Deploy to staging → Approved?</title></polyline><polyline points="892.5,800 896,808 899.5,800 892.5,800" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-7 chartlet-f-8"><polyline points="896,872 896,932" class="chartlet-flow-edge chartlet-flow-main"><title>Approved? → Deploy to production: yes</title></polyline><polyline points="892.5,932 896,940 899.5,932 892.5,932" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-7"><polyline points="920,818.105 920,745.304 984,745.304 984,624.785 904,624.785 904,457.304 864,457.304 864,373.304 824,373.304 824,226.83 216,226.83 216,184" class="chartlet-flow-edge chartlet-flow-dashed"><title>Approved? → Code review: changes requested</title></polyline><polyline points="219.5,184 216,176 212.5,184 219.5,184" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-8 chartlet-f-9"><polyline points="896,980 896,1004" class="chartlet-flow-edge chartlet-flow-main"><title>Deploy to production → Released</title></polyline><polyline points="892.5,1004 896,1012 899.5,1004 892.5,1004" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2 chartlet-f-7"></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-5"></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-4"></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4 chartlet-f-5 chartlet-f-6"></g><g class="chartlet-f chartlet-n-5 chartlet-f-2 chartlet-f-4 chartlet-f-5"></g><g class="chartlet-f chartlet-n-6 chartlet-f-4 chartlet-f-6 chartlet-f-7"></g><g class="chartlet-f chartlet-n-7 chartlet-f-1 chartlet-f-6 chartlet-f-7 chartlet-f-8"></g><g class="chartlet-f chartlet-n-8 chartlet-f-7 chartlet-f-8 chartlet-f-9"></g><g class="chartlet-f chartlet-n-9 chartlet-f-8 chartlet-f-9"></g><g class="chartlet-f chartlet-f-1 chartlet-f-2"><rect x="129.6" y="181" width="54.4" height="21" class="chartlet-diagram-chip"/><text x="179" y="195" text-anchor="end" class="chartlet-diagram-chip-text">merged</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-6"><rect x="528" y="563" width="30.16" height="21" class="chartlet-diagram-chip"/><text x="533" y="577" text-anchor="start" class="chartlet-diagram-chip-text">yes</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-5"><rect x="464.56" y="563" width="23.44" height="21" class="chartlet-diagram-chip"/><text x="483" y="577" text-anchor="end" class="chartlet-diagram-chip-text">no</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-5"><rect x="140.4" y="662" width="43.6" height="21" class="chartlet-diagram-chip"/><text x="179" y="676" text-anchor="end" class="chartlet-diagram-chip-text">retry</text></g><g class="chartlet-f chartlet-f-7 chartlet-f-8"><rect x="904" y="877" width="30.16" height="21" class="chartlet-diagram-chip"/><text x="909" y="891" text-anchor="start" class="chartlet-diagram-chip-text">yes</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-7"><rect x="928" y="784" width="121.36" height="21" class="chartlet-diagram-chip"/><text x="933" y="798" text-anchor="start" class="chartlet-diagram-chip-text">changes requested</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><polyline points="236,66.5 243.654,68.022 250.142,72.358 254.478,78.846 256,86.5 254.478,94.154 250.142,100.642 243.654,104.978 236,106.5 148,106.5 140.346,104.978 133.858,100.642 129.522,94.154 128,86.5 129.522,78.846 133.858,72.358 140.346,68.022 148,66.5 236,66.5" class="chartlet-diagram-shadow"/><polyline points="236,64 243.654,65.522 250.142,69.858 254.478,76.346 256,84 254.478,91.654 250.142,98.142 243.654,102.478 236,104 148,104 140.346,102.478 133.858,98.142 129.522,91.654 128,84 129.522,76.346 133.858,69.858 140.346,65.522 148,64 236,64" class="chartlet-flow-node chartlet-flow-start chartlet-role-green"><title>Commit pushed</title></polyline><text x="192" y="88.5" text-anchor="middle" class="chartlet-flow-label">Commit pushed</text></g><g class="chartlet-f chartlet-n-1 chartlet-f-0 chartlet-f-1 chartlet-f-2 chartlet-f-7"><rect x="140" y="138.5" width="104" height="40" class="chartlet-diagram-shadow"/><rect x="140" y="136" width="104" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Code review</title></rect><text x="192" y="160.5" text-anchor="middle" class="chartlet-flow-label">Code review</text></g><g class="chartlet-f chartlet-n-2 chartlet-f-1 chartlet-f-2 chartlet-f-3 chartlet-f-5"><rect x="464" y="302.5" width="112" height="56" class="chartlet-diagram-shadow"/><rect x="464" y="300" width="112" height="56" class="chartlet-flow-node chartlet-role-blue"><title>Build – locked inputs</title></rect><text x="520" y="325.5" text-anchor="middle" class="chartlet-flow-label">Build</text><text x="520" y="339.5" text-anchor="middle" class="chartlet-flow-sublabel">locked inputs</text></g><g class="chartlet-f chartlet-n-3 chartlet-f-2 chartlet-f-3 chartlet-f-4"><rect x="468" y="402.5" width="104" height="40" class="chartlet-diagram-shadow"/><rect x="468" y="400" width="104" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Run tests</title></rect><text x="520" y="424.5" text-anchor="middle" class="chartlet-flow-label">Run tests</text></g><g class="chartlet-f chartlet-n-4 chartlet-f-3 chartlet-f-4 chartlet-f-5 chartlet-f-6"><polyline points="520,486.5 596,518.5 520,550.5 444,518.5 520,486.5" class="chartlet-diagram-shadow"/><polyline points="520,484 596,516 520,548 444,516 520,484" class="chartlet-flow-node chartlet-role-amber"><title>All green?</title></polyline><text x="520" y="520.5" text-anchor="middle" class="chartlet-flow-label">All green?</text></g><g class="chartlet-f chartlet-n-5 chartlet-f-2 chartlet-f-4 chartlet-f-5"><rect x="152" y="690.5" width="104" height="40" class="chartlet-diagram-shadow"/><rect x="152" y="688" width="104" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Fix failures</title></rect><text x="204" y="712.5" text-anchor="middle" class="chartlet-flow-label">Fix failures</text></g><g class="chartlet-f chartlet-n-6 chartlet-f-4 chartlet-f-6 chartlet-f-7"><rect x="824" y="690.5" width="144" height="40" class="chartlet-diagram-shadow"/><rect x="824" y="688" width="144" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Deploy to staging</title></rect><text x="896" y="712.5" text-anchor="middle" class="chartlet-flow-label">Deploy to staging</text></g><g class="chartlet-f chartlet-n-7 chartlet-f-1 chartlet-f-6 chartlet-f-7 chartlet-f-8"><polyline points="896,810.5 972,842.5 896,874.5 820,842.5 896,810.5" class="chartlet-diagram-shadow"/><polyline points="896,808 972,840 896,872 820,840 896,808" class="chartlet-flow-node chartlet-role-amber"><title>Approved?</title></polyline><text x="896" y="844.5" text-anchor="middle" class="chartlet-flow-label">Approved?</text></g><g class="chartlet-f chartlet-n-8 chartlet-f-7 chartlet-f-8 chartlet-f-9"><rect x="816" y="942.5" width="160" height="40" class="chartlet-diagram-shadow"/><rect x="816" y="940" width="160" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Deploy to production</title></rect><text x="896" y="964.5" text-anchor="middle" class="chartlet-flow-label">Deploy to production</text></g><g class="chartlet-f chartlet-n-9 chartlet-f-8 chartlet-f-9"><polyline points="928,1014.5 935.654,1016.022 942.142,1020.358 946.478,1026.846 948,1034.5 946.478,1042.154 942.142,1048.642 935.654,1052.978 928,1054.5 864,1054.5 856.346,1052.978 849.858,1048.642 845.522,1042.154 844,1034.5 845.522,1026.846 849.858,1020.358 856.346,1016.022 864,1014.5 928,1014.5" class="chartlet-diagram-shadow"/><polyline points="928,1012 935.654,1013.522 942.142,1017.858 946.478,1024.346 948,1032 946.478,1039.654 942.142,1046.142 935.654,1050.478 928,1052 864,1052 856.346,1050.478 849.858,1046.142 845.522,1039.654 844,1032 845.522,1024.346 849.858,1017.858 856.346,1013.522 864,1012 928,1012" class="chartlet-flow-node chartlet-flow-end chartlet-role-green"><title>Released</title></polyline><text x="896" y="1036.5" text-anchor="middle" class="chartlet-flow-label">Released</text></g></svg><label class="chartlet-hotspot" id="chartlet-b58962593dd0ee5e-hs-0" for="chartlet-b58962593dd0ee5e-focus-0"></label><label class="chartlet-hotspot" id="chartlet-b58962593dd0ee5e-hs-1" for="chartlet-b58962593dd0ee5e-focus-1"></label><label class="chartlet-hotspot" id="chartlet-b58962593dd0ee5e-hs-2" for="chartlet-b58962593dd0ee5e-focus-2"></label><label class="chartlet-hotspot" id="chartlet-b58962593dd0ee5e-hs-3" for="chartlet-b58962593dd0ee5e-focus-3"></label><label class="chartlet-hotspot" id="chartlet-b58962593dd0ee5e-hs-4" for="chartlet-b58962593dd0ee5e-focus-4"></label><label class="chartlet-hotspot" id="chartlet-b58962593dd0ee5e-hs-5" for="chartlet-b58962593dd0ee5e-focus-5"></label><label class="chartlet-hotspot" id="chartlet-b58962593dd0ee5e-hs-6" for="chartlet-b58962593dd0ee5e-focus-6"></label><label class="chartlet-hotspot" id="chartlet-b58962593dd0ee5e-hs-7" for="chartlet-b58962593dd0ee5e-focus-7"></label><label class="chartlet-hotspot" id="chartlet-b58962593dd0ee5e-hs-8" for="chartlet-b58962593dd0ee5e-focus-8"></label><label class="chartlet-hotspot" id="chartlet-b58962593dd0ee5e-hs-9" for="chartlet-b58962593dd0ee5e-focus-9"></label></div><p class="chartlet-source">Source: Team handbook, release process</p><details class="chartlet-data" data-viz-text><summary>Show chart data</summary><table><caption>Data for From commit to release</caption><thead><tr><th scope="col">Step</th><th scope="col">Kind</th><th scope="col">Lane</th><th scope="col">Group</th><th scope="col">Leads to</th></tr></thead><tbody><tr><th scope="row">Commit pushed</th><td>start</td><td>Development</td><td></td><td>Code review</td></tr><tr><th scope="row">Code review</th><td>step</td><td>Development</td><td></td><td>Build (merged)</td></tr><tr><th scope="row">Build</th><td>step</td><td>Continuous integration</td><td>Quality gates</td><td>Run tests</td></tr><tr><th scope="row">Run tests</th><td>step</td><td>Continuous integration</td><td>Quality gates</td><td>All green?</td></tr><tr><th scope="row">All green?</th><td>decision</td><td>Continuous integration</td><td>Quality gates</td><td>Deploy to staging (yes), Fix failures (no)</td></tr><tr><th scope="row">Fix failures</th><td>step</td><td>Development</td><td></td><td>Build (retry)</td></tr><tr><th scope="row">Deploy to staging</th><td>step</td><td>Operations</td><td></td><td>Approved?</td></tr><tr><th scope="row">Approved?</th><td>decision</td><td>Operations</td><td></td><td>Deploy to production (yes), Code review (changes requested)</td></tr><tr><th scope="row">Deploy to production</th><td>step</td><td>Operations</td><td></td><td>Released</td></tr><tr><th scope="row">Released</th><td>end</td><td>Operations</td><td></td><td></td></tr></tbody></table></details></figure></div>