chartlet 0.23.0

Compile structured data into deterministic, accessible static charts
Documentation
1
<div class="chartlet-wrapper chartlet-responsive chartlet-bp-640"><style>.chartlet-wrapper.chartlet-responsive{display:block;width:100%;container-type:inline-size}.chartlet-variant-mobile{display:none}@container (max-width:639px){.chartlet-bp-640 .chartlet-variant-desktop{display:none}.chartlet-bp-640 .chartlet-variant-mobile{display:block}}</style><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-d13bc95ed4c499e1 .chartlet-f{opacity:.18}#chartlet-d13bc95ed4c499e1-hs-0{left:11.429%;top:5.839%;width:11.429%;height:3.65%}#chartlet-d13bc95ed4c499e1-hs-1{left:12.5%;top:12.044%;width:9.286%;height:3.65%}#chartlet-d13bc95ed4c499e1-hs-2{left:41.429%;top:26.642%;width:9.286%;height:5.109%}#chartlet-d13bc95ed4c499e1-hs-3{left:41.429%;top:35.401%;width:9.286%;height:3.65%}#chartlet-d13bc95ed4c499e1-hs-4{left:39.286%;top:42.701%;width:13.571%;height:5.839%}#chartlet-d13bc95ed4c499e1-hs-5{left:13.571%;top:60.949%;width:9.286%;height:3.65%}#chartlet-d13bc95ed4c499e1-hs-6{left:73.571%;top:60.949%;width:12.857%;height:3.65%}#chartlet-d13bc95ed4c499e1-hs-7{left:73.214%;top:71.533%;width:13.571%;height:5.839%}#chartlet-d13bc95ed4c499e1-hs-8{left:72.857%;top:83.212%;width:14.286%;height:3.65%}#chartlet-d13bc95ed4c499e1-hs-9{left:75.357%;top:89.416%;width:9.286%;height:3.65%}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-0:checked) #chartlet-d13bc95ed4c499e1 .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-0:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-0:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-1:checked) #chartlet-d13bc95ed4c499e1 .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-1:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-1:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-2:checked) #chartlet-d13bc95ed4c499e1 .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-2:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-2:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-3:checked) #chartlet-d13bc95ed4c499e1 .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-3:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-3:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-4:checked) #chartlet-d13bc95ed4c499e1 .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-4:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-4:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-5:checked) #chartlet-d13bc95ed4c499e1 .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-5:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-5:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-5 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-6:checked) #chartlet-d13bc95ed4c499e1 .chartlet-f-6{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-6:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-6 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-6:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-6 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-7:checked) #chartlet-d13bc95ed4c499e1 .chartlet-f-7{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-7:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-7 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-7:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-7 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-8:checked) #chartlet-d13bc95ed4c499e1 .chartlet-f-8{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-8:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-8 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-8:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-8 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-9:checked) #chartlet-d13bc95ed4c499e1 .chartlet-f-9{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-9:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-9 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-9:checked) #chartlet-d13bc95ed4c499e1 .chartlet-n-9 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(.chartlet-focus-node:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-f{opacity:.18}#chartlet-d13bc95ed4c499e1-m-hs-0{left:6.849%;top:9.512%;width:21.918%;height:2.571%}#chartlet-d13bc95ed4c499e1-m-hs-1{left:8.904%;top:14.91%;width:17.808%;height:2.571%}#chartlet-d13bc95ed4c499e1-m-hs-2{left:34.247%;top:28.792%;width:17.808%;height:3.599%}#chartlet-d13bc95ed4c499e1-m-hs-3{left:38.356%;top:36.504%;width:17.808%;height:2.571%}#chartlet-d13bc95ed4c499e1-m-hs-4{left:34.247%;top:43.188%;width:26.027%;height:4.113%}#chartlet-d13bc95ed4c499e1-m-hs-5{left:10.959%;top:60.411%;width:17.808%;height:2.571%}#chartlet-d13bc95ed4c499e1-m-hs-6{left:65.753%;top:60.411%;width:24.658%;height:2.571%}#chartlet-d13bc95ed4c499e1-m-hs-7{left:66.438%;top:70.18%;width:26.027%;height:4.113%}#chartlet-d13bc95ed4c499e1-m-hs-8{left:65.753%;top:80.463%;width:27.397%;height:2.571%}#chartlet-d13bc95ed4c499e1-m-hs-9{left:70.548%;top:85.861%;width:17.808%;height:2.571%}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-0:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-f-0{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-0:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-0 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-0:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-0 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-1:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-f-1{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-1:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-1 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-1:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-1 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-2:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-f-2{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-2:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-2 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-2:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-2 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-3:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-f-3{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-3:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-3 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-3:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-3 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-4:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-f-4{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-4:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-4 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-4:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-4 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-5:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-f-5{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-5:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-5 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-5:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-5 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-6:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-f-6{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-6:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-6 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-6:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-6 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-7:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-f-7{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-7:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-7 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-7:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-7 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-8:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-f-8{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-8:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-8 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-8:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-8 .chartlet-seq-box{stroke-width:3}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-9:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-f-9{opacity:1}.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-9:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-9 .chartlet-flow-node,.chartlet-wrapper:has(#chartlet-d13bc95ed4c499e1-focus-9:checked) #chartlet-d13bc95ed4c499e1-m .chartlet-n-9 .chartlet-seq-box{stroke-width:3}</style><details class="chartlet-focus"><summary>Focus</summary><fieldset><label><input type="radio" name="chartlet-d13bc95ed4c499e1-focus" checked> Show all</label><label><input type="radio" name="chartlet-d13bc95ed4c499e1-focus" class="chartlet-focus-node" id="chartlet-d13bc95ed4c499e1-focus-0"> Commit pushed</label><label><input type="radio" name="chartlet-d13bc95ed4c499e1-focus" class="chartlet-focus-node" id="chartlet-d13bc95ed4c499e1-focus-1"> Code review</label><label><input type="radio" name="chartlet-d13bc95ed4c499e1-focus" class="chartlet-focus-node" id="chartlet-d13bc95ed4c499e1-focus-2"> Build</label><label><input type="radio" name="chartlet-d13bc95ed4c499e1-focus" class="chartlet-focus-node" id="chartlet-d13bc95ed4c499e1-focus-3"> Run tests</label><label><input type="radio" name="chartlet-d13bc95ed4c499e1-focus" class="chartlet-focus-node" id="chartlet-d13bc95ed4c499e1-focus-4"> All green?</label><label><input type="radio" name="chartlet-d13bc95ed4c499e1-focus" class="chartlet-focus-node" id="chartlet-d13bc95ed4c499e1-focus-5"> Fix failures</label><label><input type="radio" name="chartlet-d13bc95ed4c499e1-focus" class="chartlet-focus-node" id="chartlet-d13bc95ed4c499e1-focus-6"> Deploy to staging</label><label><input type="radio" name="chartlet-d13bc95ed4c499e1-focus" class="chartlet-focus-node" id="chartlet-d13bc95ed4c499e1-focus-7"> Approved?</label><label><input type="radio" name="chartlet-d13bc95ed4c499e1-focus" class="chartlet-focus-node" id="chartlet-d13bc95ed4c499e1-focus-8"> Deploy to production</label><label><input type="radio" name="chartlet-d13bc95ed4c499e1-focus" class="chartlet-focus-node" id="chartlet-d13bc95ed4c499e1-focus-9"> Released</label></fieldset></details><figure class="chartlet-figure" data-viz="chart"><figcaption>From commit to release: the quality gate</figcaption><div class="chartlet-variant-desktop"><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="1120" height="1096" viewBox="0 0 1120 1096" id="chartlet-d13bc95ed4c499e1" role="img" aria-labelledby="chartlet-d13bc95ed4c499e1-title chartlet-d13bc95ed4c499e1-description" class="chartlet-root"><title id="chartlet-d13bc95ed4c499e1-title">From commit to release: the quality gate</title><desc id="chartlet-d13bc95ed4c499e1-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 &quot;Quality gates&quot;: Build, Run tests, All green?. Emphasized: All green?. Emphasized path: Build → Run tests → All green? → Deploy to staging. Legend: start, end, step, decision, emphasized, solid line, dashed line, emphasized path.</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-d13bc95ed4c499e1 .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-d13bc95ed4c499e1 .chartlet-label,#chartlet-d13bc95ed4c499e1 .chartlet-tick,#chartlet-d13bc95ed4c499e1 .chartlet-value,#chartlet-d13bc95ed4c499e1 .chartlet-value-inverse,#chartlet-d13bc95ed4c499e1 .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-d13bc95ed4c499e1 .chartlet-value,#chartlet-d13bc95ed4c499e1 .chartlet-value-inverse{font-weight:600}#chartlet-d13bc95ed4c499e1 .chartlet-value{fill:var(--chartlet-text)}#chartlet-d13bc95ed4c499e1 .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-d13bc95ed4c499e1 .chartlet-axis-title{font-weight:600}#chartlet-d13bc95ed4c499e1 .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-d13bc95ed4c499e1 .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-d13bc95ed4c499e1 .chartlet-bar,#chartlet-d13bc95ed4c499e1 .chartlet-point{fill:var(--chartlet-accent)}#chartlet-d13bc95ed4c499e1 .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-d13bc95ed4c499e1 .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-d13bc95ed4c499e1 .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-d13bc95ed4c499e1 .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-d13bc95ed4c499e1 .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-d13bc95ed4c499e1 .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-d13bc95ed4c499e1 .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-d13bc95ed4c499e1 .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-d13bc95ed4c499e1 .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-d13bc95ed4c499e1 .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-d13bc95ed4c499e1 .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-d13bc95ed4c499e1 .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-d13bc95ed4c499e1 .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-d13bc95ed4c499e1 .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-d13bc95ed4c499e1 .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-d13bc95ed4c499e1 .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-d13bc95ed4c499e1 .chartlet-flow-start{stroke-width:2}#chartlet-d13bc95ed4c499e1 .chartlet-flow-end{stroke-width:3}#chartlet-d13bc95ed4c499e1 .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-d13bc95ed4c499e1 .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-d13bc95ed4c499e1 .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-d13bc95ed4c499e1 .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-d13bc95ed4c499e1 .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-d13bc95ed4c499e1 .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-d13bc95ed4c499e1 .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-d13bc95ed4c499e1 .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-d13bc95ed4c499e1 .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-d13bc95ed4c499e1 .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-d13bc95ed4c499e1 .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-d13bc95ed4c499e1 .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-d13bc95ed4c499e1 .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-d13bc95ed4c499e1 .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-d13bc95ed4c499e1 .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-d13bc95ed4c499e1 .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-d13bc95ed4c499e1 .chartlet-emph .chartlet-flow-node,#chartlet-d13bc95ed4c499e1 .chartlet-emph .chartlet-seq-box{stroke:var(--chartlet-accent);stroke-width:3.5;fill:var(--chartlet-accent);fill-opacity:.14}#chartlet-d13bc95ed4c499e1 .chartlet-emph .chartlet-diagram-shadow{fill:none}#chartlet-d13bc95ed4c499e1 .chartlet-emph .chartlet-seq-actor,#chartlet-d13bc95ed4c499e1 .chartlet-emph .chartlet-seq-actor-head{stroke:var(--chartlet-accent);stroke-width:2.6}#chartlet-d13bc95ed4c499e1 .chartlet-emph-ring{fill:none;stroke:var(--chartlet-accent);stroke-width:3}#chartlet-d13bc95ed4c499e1 .chartlet-emph-edge .chartlet-flow-edge,#chartlet-d13bc95ed4c499e1 .chartlet-emph-edge .chartlet-seq-message{stroke:var(--chartlet-accent);stroke-width:3.2}#chartlet-d13bc95ed4c499e1 .chartlet-emph-edge .chartlet-flow-head,#chartlet-d13bc95ed4c499e1 .chartlet-emph-edge .chartlet-seq-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-d13bc95ed4c499e1 .chartlet-emph-edge .chartlet-flow-hollow{fill:var(--chartlet-background)}#chartlet-d13bc95ed4c499e1 .chartlet-emph-edge .chartlet-flow-solid{fill:var(--chartlet-accent)}#chartlet-d13bc95ed4c499e1 .chartlet-emph-edge .chartlet-flow-open,#chartlet-d13bc95ed4c499e1 .chartlet-emph-edge .chartlet-seq-head-open{stroke:var(--chartlet-accent);stroke-width:2.4}#chartlet-d13bc95ed4c499e1 .chartlet-emph-edge .chartlet-diagram-chip-text{font-weight:700}#chartlet-d13bc95ed4c499e1 .chartlet-emph-quiet .chartlet-flow-main{stroke:var(--chartlet-zero);stroke-width:1.4}#chartlet-d13bc95ed4c499e1 .chartlet-emph-quiet .chartlet-flow-main-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero)}#chartlet-d13bc95ed4c499e1 .chartlet-legend-line{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-d13bc95ed4c499e1 .chartlet-legend-dashed{stroke-dasharray:5 4}#chartlet-d13bc95ed4c499e1 .chartlet-legend-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-d13bc95ed4c499e1 .chartlet-legend-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-d13bc95ed4c499e1 .chartlet-legend-path{stroke:var(--chartlet-accent);stroke-width:3.2}#chartlet-d13bc95ed4c499e1 .chartlet-legend-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-d13bc95ed4c499e1 .chartlet-legend-open{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}#chartlet-d13bc95ed4c499e1 .chartlet-legend-emph{fill:var(--chartlet-accent);fill-opacity:.14;stroke:var(--chartlet-accent);stroke-width:3.5;rx:4px}#chartlet-d13bc95ed4c499e1 .chartlet-legend-text{font-size:12px;fill:var(--chartlet-muted)}</style><rect x="24" y="20" width="336" height="1016" 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="1016" 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="1016" 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="428" y="264" width="176" height="280" class="chartlet-flow-group"/><text x="436" y="277" text-anchor="start" class="chartlet-flow-group-label">Quality gates</text><g class="chartlet-f chartlet-f-0 chartlet-f-1 chartlet-emph-quiet"><polyline points="192,104 192,124" class="chartlet-flow-edge chartlet-flow-main"><title>Commit pushed → Code review</title></polyline><polyline points="188.5,124 192,132 195.5,124 188.5,124" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2 chartlet-emph-quiet"><polyline points="192,172 192,233.937 516,233.937 516,284" class="chartlet-flow-edge chartlet-flow-main"><title>Code review → Build: merged</title></polyline><polyline points="512.5,284 516,292 519.5,284 512.5,284" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-3 chartlet-emph-edge"><polyline points="516,348 516,380" class="chartlet-flow-edge chartlet-flow-main"><title>Build → Run tests</title></polyline><polyline points="512.5,380 516,388 519.5,380 512.5,380" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-4 chartlet-emph-edge"><polyline points="516,428 516,460" class="chartlet-flow-edge chartlet-flow-main"><title>Run tests → All green?</title></polyline><polyline points="512.5,460 516,468 519.5,460 512.5,460" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-6 chartlet-emph-edge"><polyline points="516,532 516,605.937 896,605.937 896,660" class="chartlet-flow-edge chartlet-flow-main"><title>All green? → Deploy to staging: yes</title></polyline><polyline points="892.5,660 896,668 899.5,660 892.5,660" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-5 chartlet-emph-quiet"><polyline points="492,521.895 492,606.976 216,606.976 216,660" class="chartlet-flow-edge"><title>All green? → Fix failures: no</title></polyline><polyline points="212.5,660 216,668 219.5,660 212.5,660" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-5 chartlet-emph-quiet"><polyline points="192,668 192,593.937 256,593.937 256,363.213 492,363.213 492,356" class="chartlet-flow-edge"><title>Fix failures → Build: retry</title></polyline><polyline points="495.5,356 492,348 488.5,356 495.5,356" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-6 chartlet-f-7 chartlet-emph-quiet"><polyline points="896,708 896,776" class="chartlet-flow-edge chartlet-flow-main"><title>Deploy to staging → Approved?</title></polyline><polyline points="892.5,776 896,784 899.5,776 892.5,776" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-7 chartlet-f-8 chartlet-emph-quiet"><polyline points="896,848 896,904" class="chartlet-flow-edge chartlet-flow-main"><title>Approved? → Deploy to production: yes</title></polyline><polyline points="892.5,904 896,912 899.5,904 892.5,904" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-7 chartlet-emph-quiet"><polyline points="920,794.105 920,723.213 984,723.213 984,606.976 904,606.976 904,443.213 864,443.213 864,363.213 824,363.213 824,220.898 216,220.898 216,180" class="chartlet-flow-edge chartlet-flow-dashed"><title>Approved? → Code review: changes requested</title></polyline><polyline points="219.5,180 216,172 212.5,180 219.5,180" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-8 chartlet-f-9 chartlet-emph-quiet"><polyline points="896,952 896,972" class="chartlet-flow-edge chartlet-flow-main"><title>Deploy to production → Released</title></polyline><polyline points="892.5,972 896,980 899.5,972 892.5,972" 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 chartlet-emph-quiet"><rect x="133.6" y="177" width="54.4" height="21" class="chartlet-diagram-chip"/><text x="183" y="191" text-anchor="end" class="chartlet-diagram-chip-text">merged</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-6 chartlet-emph-edge"><rect x="520" y="547" width="30.16" height="21" class="chartlet-diagram-chip"/><text x="525" y="561" text-anchor="start" class="chartlet-diagram-chip-text">yes</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-5 chartlet-emph-quiet"><rect x="464.56" y="547" width="23.44" height="21" class="chartlet-diagram-chip"/><text x="483" y="561" text-anchor="end" class="chartlet-diagram-chip-text">no</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-5 chartlet-emph-quiet"><rect x="144.4" y="642" width="43.6" height="21" class="chartlet-diagram-chip"/><text x="183" y="656" text-anchor="end" class="chartlet-diagram-chip-text">retry</text></g><g class="chartlet-f chartlet-f-7 chartlet-f-8 chartlet-emph-quiet"><rect x="900" y="853" width="30.16" height="21" class="chartlet-diagram-chip"/><text x="905" y="867" text-anchor="start" class="chartlet-diagram-chip-text">yes</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-7 chartlet-emph-quiet"><rect x="924" y="760" width="121.36" height="21" class="chartlet-diagram-chip"/><text x="929" y="774" 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="134.5" width="104" height="40" class="chartlet-diagram-shadow"/><rect x="140" y="132" width="104" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Code review</title></rect><text x="192" y="156.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="294.5" width="104" height="56" class="chartlet-diagram-shadow"/><rect x="464" y="292" width="104" height="56" class="chartlet-flow-node chartlet-role-blue"><title>Build – locked inputs</title></rect><text x="516" y="317.5" text-anchor="middle" class="chartlet-flow-label">Build</text><text x="516" y="331.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="464" y="390.5" width="104" height="40" class="chartlet-diagram-shadow"/><rect x="464" y="388" width="104" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Run tests</title></rect><text x="516" y="412.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 chartlet-emph"><polyline points="516,470.5 592,502.5 516,534.5 440,502.5 516,470.5" class="chartlet-diagram-shadow"/><polyline points="516,468 592,500 516,532 440,500 516,468" class="chartlet-flow-node chartlet-role-amber"><title>All green?</title></polyline><text x="516" y="504.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="670.5" width="104" height="40" class="chartlet-diagram-shadow"/><rect x="152" y="668" width="104" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Fix failures</title></rect><text x="204" y="692.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="670.5" width="144" height="40" class="chartlet-diagram-shadow"/><rect x="824" y="668" width="144" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Deploy to staging</title></rect><text x="896" y="692.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,786.5 972,818.5 896,850.5 820,818.5 896,786.5" class="chartlet-diagram-shadow"/><polyline points="896,784 972,816 896,848 820,816 896,784" class="chartlet-flow-node chartlet-role-amber"><title>Approved?</title></polyline><text x="896" y="820.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="914.5" width="160" height="40" class="chartlet-diagram-shadow"/><rect x="816" y="912" width="160" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Deploy to production</title></rect><text x="896" y="936.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,982.5 935.654,984.022 942.142,988.358 946.478,994.846 948,1002.5 946.478,1010.154 942.142,1016.642 935.654,1020.978 928,1022.5 864,1022.5 856.346,1020.978 849.858,1016.642 845.522,1010.154 844,1002.5 845.522,994.846 849.858,988.358 856.346,984.022 864,982.5 928,982.5" class="chartlet-diagram-shadow"/><polyline points="928,980 935.654,981.522 942.142,985.858 946.478,992.346 948,1000 946.478,1007.654 942.142,1014.142 935.654,1018.478 928,1020 864,1020 856.346,1018.478 849.858,1014.142 845.522,1007.654 844,1000 845.522,992.346 849.858,985.858 856.346,981.522 864,980 928,980" class="chartlet-flow-node chartlet-flow-end chartlet-role-green"><title>Released</title></polyline><text x="896" y="1004.5" text-anchor="middle" class="chartlet-flow-label">Released</text></g><g class="chartlet-legend-strip"><polyline points="42,1070.5 45.061,1071.109 47.657,1072.843 49.391,1075.439 50,1078.5 49.391,1081.561 47.657,1084.157 45.061,1085.891 42,1086.5 32,1086.5 28.939,1085.891 26.343,1084.157 24.609,1081.561 24,1078.5 24.609,1075.439 26.343,1072.843 28.939,1071.109 32,1070.5 42,1070.5" class="chartlet-diagram-shadow"/><polyline points="42,1068 45.061,1068.609 47.657,1070.343 49.391,1072.939 50,1076 49.391,1079.061 47.657,1081.657 45.061,1083.391 42,1084 32,1084 28.939,1083.391 26.343,1081.657 24.609,1079.061 24,1076 24.609,1072.939 26.343,1070.343 28.939,1068.609 32,1068 42,1068" class="chartlet-flow-node chartlet-flow-start chartlet-role-green"/><text x="58" y="1080" text-anchor="start" class="chartlet-legend-text">Start</text><polyline points="132.92,1070.5 135.981,1071.109 138.577,1072.843 140.311,1075.439 140.92,1078.5 140.311,1081.561 138.577,1084.157 135.981,1085.891 132.92,1086.5 122.92,1086.5 119.859,1085.891 117.263,1084.157 115.529,1081.561 114.92,1078.5 115.529,1075.439 117.263,1072.843 119.859,1071.109 122.92,1070.5 132.92,1070.5" class="chartlet-diagram-shadow"/><polyline points="132.92,1068 135.981,1068.609 138.577,1070.343 140.311,1072.939 140.92,1076 140.311,1079.061 138.577,1081.657 135.981,1083.391 132.92,1084 122.92,1084 119.859,1083.391 117.263,1081.657 115.529,1079.061 114.92,1076 115.529,1072.939 117.263,1070.343 119.859,1068.609 122.92,1068 132.92,1068" class="chartlet-flow-node chartlet-flow-end chartlet-role-green"/><text x="148.92" y="1080" text-anchor="start" class="chartlet-legend-text">End</text><rect x="192.4" y="1070.5" width="26" height="16" class="chartlet-diagram-shadow"/><rect x="192.4" y="1068" width="26" height="16" class="chartlet-flow-node chartlet-role-blue"/><text x="226.4" y="1080" text-anchor="start" class="chartlet-legend-text">Step</text><polyline points="289.6,1070.5 302.6,1078.5 289.6,1086.5 276.6,1078.5 289.6,1070.5" class="chartlet-diagram-shadow"/><polyline points="289.6,1068 302.6,1076 289.6,1084 276.6,1076 289.6,1068" class="chartlet-flow-node chartlet-role-amber"/><text x="310.6" y="1080" text-anchor="start" class="chartlet-legend-text">Decision</text><rect x="381.44" y="1068" width="26" height="16" class="chartlet-legend-emph"/><text x="415.44" y="1080" text-anchor="start" class="chartlet-legend-text">Emphasized</text><line x1="506.92" y1="1076" x2="532.92" y2="1076" class="chartlet-legend-line"/><text x="540.92" y="1080" text-anchor="start" class="chartlet-legend-text">Solid line</text><line x1="616.08" y1="1076" x2="642.08" y2="1076" class="chartlet-legend-line chartlet-legend-dashed"/><text x="650.08" y="1080" text-anchor="start" class="chartlet-legend-text">Dashed line</text><line x1="738.2" y1="1076" x2="764.2" y2="1076" class="chartlet-legend-line chartlet-legend-path"/><text x="772.2" y="1080" text-anchor="start" class="chartlet-legend-text">Emphasized path</text></g></svg><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-hs-0" for="chartlet-d13bc95ed4c499e1-focus-0"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-hs-1" for="chartlet-d13bc95ed4c499e1-focus-1"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-hs-2" for="chartlet-d13bc95ed4c499e1-focus-2"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-hs-3" for="chartlet-d13bc95ed4c499e1-focus-3"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-hs-4" for="chartlet-d13bc95ed4c499e1-focus-4"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-hs-5" for="chartlet-d13bc95ed4c499e1-focus-5"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-hs-6" for="chartlet-d13bc95ed4c499e1-focus-6"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-hs-7" for="chartlet-d13bc95ed4c499e1-focus-7"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-hs-8" for="chartlet-d13bc95ed4c499e1-focus-8"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-hs-9" for="chartlet-d13bc95ed4c499e1-focus-9"></label></div></div><div class="chartlet-variant-mobile"><div class="chartlet-stage"><svg xmlns="http://www.w3.org/2000/svg" width="584" height="1556" viewBox="0 0 584 1556" id="chartlet-d13bc95ed4c499e1-m" role="img" aria-labelledby="chartlet-d13bc95ed4c499e1-m-title chartlet-d13bc95ed4c499e1-m-description" class="chartlet-root"><title id="chartlet-d13bc95ed4c499e1-m-title">From commit to release: the quality gate</title><desc id="chartlet-d13bc95ed4c499e1-m-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 &quot;Quality gates&quot;: Build, Run tests, All green?. Emphasized: All green?. Emphasized path: Build → Run tests → All green? → Deploy to staging. Legend: start, end, step, decision, emphasized, solid line, dashed line, emphasized path.</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-d13bc95ed4c499e1-m .chartlet-title{font-size:22px;font-weight:650;fill:var(--chartlet-text)}#chartlet-d13bc95ed4c499e1-m .chartlet-label,#chartlet-d13bc95ed4c499e1-m .chartlet-tick,#chartlet-d13bc95ed4c499e1-m .chartlet-value,#chartlet-d13bc95ed4c499e1-m .chartlet-value-inverse,#chartlet-d13bc95ed4c499e1-m .chartlet-axis-title{font-size:12px;fill:var(--chartlet-muted)}#chartlet-d13bc95ed4c499e1-m .chartlet-value,#chartlet-d13bc95ed4c499e1-m .chartlet-value-inverse{font-weight:600}#chartlet-d13bc95ed4c499e1-m .chartlet-value{fill:var(--chartlet-text)}#chartlet-d13bc95ed4c499e1-m .chartlet-value-inverse{fill:var(--chartlet-background)}#chartlet-d13bc95ed4c499e1-m .chartlet-axis-title{font-weight:600}#chartlet-d13bc95ed4c499e1-m .chartlet-grid{stroke:var(--chartlet-grid);stroke-width:1}#chartlet-d13bc95ed4c499e1-m .chartlet-zero{stroke:var(--chartlet-zero);stroke-width:1.5}#chartlet-d13bc95ed4c499e1-m .chartlet-bar,#chartlet-d13bc95ed4c499e1-m .chartlet-point{fill:var(--chartlet-accent)}#chartlet-d13bc95ed4c499e1-m .chartlet-line{fill:none;stroke:var(--chartlet-accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}#chartlet-d13bc95ed4c499e1-m .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-d13bc95ed4c499e1-m .chartlet-role-blue{fill:var(--chartlet-role-blue-fill);stroke:var(--chartlet-role-blue)}#chartlet-d13bc95ed4c499e1-m .chartlet-role-green{fill:var(--chartlet-role-green-fill);stroke:var(--chartlet-role-green)}#chartlet-d13bc95ed4c499e1-m .chartlet-role-amber{fill:var(--chartlet-role-amber-fill);stroke:var(--chartlet-role-amber)}#chartlet-d13bc95ed4c499e1-m .chartlet-role-teal{fill:var(--chartlet-role-teal-fill);stroke:var(--chartlet-role-teal)}#chartlet-d13bc95ed4c499e1-m .chartlet-role-violet{fill:var(--chartlet-role-violet-fill);stroke:var(--chartlet-role-violet)}#chartlet-d13bc95ed4c499e1-m .chartlet-role-gray{fill:var(--chartlet-role-gray-fill);stroke:var(--chartlet-role-gray)}#chartlet-d13bc95ed4c499e1-m .chartlet-role-red{fill:var(--chartlet-role-red-fill);stroke:var(--chartlet-role-red)}#chartlet-d13bc95ed4c499e1-m .chartlet-diagram-rim{fill:none;stroke:var(--chartlet-role-teal);stroke-width:1.5}#chartlet-d13bc95ed4c499e1-m .chartlet-diagram-shadow{fill:var(--chartlet-shadow);stroke:none;rx:7px}#chartlet-d13bc95ed4c499e1-m .chartlet-diagram-chip{fill:var(--chartlet-background);stroke:var(--chartlet-grid);stroke-width:1;rx:4px}#chartlet-d13bc95ed4c499e1-m .chartlet-diagram-chip-text{font-size:12px;fill:var(--chartlet-text)}#chartlet-d13bc95ed4c499e1-m .chartlet-diagram-badge{fill:var(--chartlet-accent);stroke:var(--chartlet-background);stroke-width:2}#chartlet-d13bc95ed4c499e1-m .chartlet-diagram-badge-text{font-size:10px;font-weight:700;fill:var(--chartlet-background)}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-node{stroke-width:1.5;stroke-linejoin:round;rx:7px}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-start{stroke-width:2}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-end{stroke-width:3}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-external{stroke-dasharray:5 3}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-inner{stroke:var(--chartlet-role-blue);stroke-width:1}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-label{font-size:13px;font-weight:600;fill:var(--chartlet-text)}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-sublabel{font-size:11px;fill:var(--chartlet-muted)}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-edge{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-dashed{stroke-dasharray:5 4}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-main-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-lane{fill:var(--chartlet-lane);stroke:var(--chartlet-grid);stroke-width:1}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-lane-alt{fill:var(--chartlet-background)}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-lane-head{fill:var(--chartlet-lane-head);stroke:none}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-lane-label{font-size:11px;font-weight:650;fill:var(--chartlet-muted);letter-spacing:.04em}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-group{fill:var(--chartlet-accent);fill-opacity:.04;stroke:var(--chartlet-zero);stroke-width:1;stroke-dasharray:4 3;rx:10px}#chartlet-d13bc95ed4c499e1-m .chartlet-flow-group-label{font-size:11px;font-weight:600;fill:var(--chartlet-muted)}#chartlet-d13bc95ed4c499e1-m .chartlet-emph .chartlet-flow-node,#chartlet-d13bc95ed4c499e1-m .chartlet-emph .chartlet-seq-box{stroke:var(--chartlet-accent);stroke-width:3.5;fill:var(--chartlet-accent);fill-opacity:.14}#chartlet-d13bc95ed4c499e1-m .chartlet-emph .chartlet-diagram-shadow{fill:none}#chartlet-d13bc95ed4c499e1-m .chartlet-emph .chartlet-seq-actor,#chartlet-d13bc95ed4c499e1-m .chartlet-emph .chartlet-seq-actor-head{stroke:var(--chartlet-accent);stroke-width:2.6}#chartlet-d13bc95ed4c499e1-m .chartlet-emph-ring{fill:none;stroke:var(--chartlet-accent);stroke-width:3}#chartlet-d13bc95ed4c499e1-m .chartlet-emph-edge .chartlet-flow-edge,#chartlet-d13bc95ed4c499e1-m .chartlet-emph-edge .chartlet-seq-message{stroke:var(--chartlet-accent);stroke-width:3.2}#chartlet-d13bc95ed4c499e1-m .chartlet-emph-edge .chartlet-flow-head,#chartlet-d13bc95ed4c499e1-m .chartlet-emph-edge .chartlet-seq-head{fill:var(--chartlet-accent);stroke:var(--chartlet-accent)}#chartlet-d13bc95ed4c499e1-m .chartlet-emph-edge .chartlet-flow-hollow{fill:var(--chartlet-background)}#chartlet-d13bc95ed4c499e1-m .chartlet-emph-edge .chartlet-flow-solid{fill:var(--chartlet-accent)}#chartlet-d13bc95ed4c499e1-m .chartlet-emph-edge .chartlet-flow-open,#chartlet-d13bc95ed4c499e1-m .chartlet-emph-edge .chartlet-seq-head-open{stroke:var(--chartlet-accent);stroke-width:2.4}#chartlet-d13bc95ed4c499e1-m .chartlet-emph-edge .chartlet-diagram-chip-text{font-weight:700}#chartlet-d13bc95ed4c499e1-m .chartlet-emph-quiet .chartlet-flow-main{stroke:var(--chartlet-zero);stroke-width:1.4}#chartlet-d13bc95ed4c499e1-m .chartlet-emph-quiet .chartlet-flow-main-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero)}#chartlet-d13bc95ed4c499e1-m .chartlet-legend-line{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linejoin:round}#chartlet-d13bc95ed4c499e1-m .chartlet-legend-dashed{stroke-dasharray:5 4}#chartlet-d13bc95ed4c499e1-m .chartlet-legend-dotted{stroke-dasharray:1 4;stroke-linecap:round}#chartlet-d13bc95ed4c499e1-m .chartlet-legend-main{stroke:var(--chartlet-accent);stroke-width:2.2}#chartlet-d13bc95ed4c499e1-m .chartlet-legend-path{stroke:var(--chartlet-accent);stroke-width:3.2}#chartlet-d13bc95ed4c499e1-m .chartlet-legend-head{fill:var(--chartlet-zero);stroke:var(--chartlet-zero);stroke-width:1;stroke-linejoin:round}#chartlet-d13bc95ed4c499e1-m .chartlet-legend-open{fill:none;stroke:var(--chartlet-zero);stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}#chartlet-d13bc95ed4c499e1-m .chartlet-legend-emph{fill:var(--chartlet-accent);fill-opacity:.14;stroke:var(--chartlet-accent);stroke-width:3.5;rx:4px}#chartlet-d13bc95ed4c499e1-m .chartlet-legend-text{font-size:12px;fill:var(--chartlet-muted)}</style><rect x="24" y="104" width="160" height="1288" class="chartlet-flow-lane"/><rect x="24.5" y="104.5" width="159" height="27" class="chartlet-flow-lane-head"/><text x="104" y="121" text-anchor="middle" class="chartlet-flow-lane-label">Development</text><rect x="184" y="104" width="184" height="1288" class="chartlet-flow-lane chartlet-flow-lane-alt"/><rect x="184.5" y="104.5" width="183" height="27" class="chartlet-flow-lane-head"/><text x="276" y="121" text-anchor="middle" class="chartlet-flow-lane-label">Continuous integration</text><rect x="368" y="104" width="192" height="1288" class="chartlet-flow-lane"/><rect x="368.5" y="104.5" width="191" height="27" class="chartlet-flow-lane-head"/><text x="464" y="121" text-anchor="middle" class="chartlet-flow-lane-label">Operations</text><rect x="188" y="420" width="176" height="328" class="chartlet-flow-group"/><text x="196" y="433" text-anchor="start" class="chartlet-flow-group-label">Quality gates</text><g class="chartlet-f chartlet-f-0 chartlet-f-1 chartlet-emph-quiet"><polyline points="104,188 104,224" class="chartlet-flow-edge chartlet-flow-main"><title>Commit pushed → Code review</title></polyline><polyline points="100.5,224 104,232 107.5,224 100.5,224" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-2 chartlet-emph-quiet"><polyline points="104,272 104,363.2 252,363.2 252,440" class="chartlet-flow-edge chartlet-flow-main"><title>Code review → Build: merged</title></polyline><polyline points="248.5,440 252,448 255.5,440 248.5,440" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-3 chartlet-emph-edge"><polyline points="252,504 252,526.4 276,526.4 276,560" class="chartlet-flow-edge chartlet-flow-main"><title>Build → Run tests</title></polyline><polyline points="272.5,560 276,568 279.5,560 272.5,560" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-3 chartlet-f-4 chartlet-emph-edge"><polyline points="276,608 276,664" class="chartlet-flow-edge chartlet-flow-main"><title>Run tests → All green?</title></polyline><polyline points="272.5,664 276,672 279.5,664 272.5,664" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-6 chartlet-emph-edge"><polyline points="276,736 276,847.2 456,847.2 456,932" class="chartlet-flow-edge chartlet-flow-main"><title>All green? → Deploy to staging: yes</title></polyline><polyline points="452.5,932 456,940 459.5,932 452.5,932" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-4 chartlet-f-5 chartlet-emph-quiet"><polyline points="252,725.895 252,846.4 128,846.4 128,932" class="chartlet-flow-edge"><title>All green? → Fix failures: no</title></polyline><polyline points="124.5,932 128,940 131.5,932 124.5,932" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-2 chartlet-f-5 chartlet-emph-quiet"><polyline points="104,940 104,827.2 168,827.2 168,526.4 228,526.4 228,512" class="chartlet-flow-edge"><title>Fix failures → Build: retry</title></polyline><polyline points="231.5,512 228,504 224.5,512 231.5,512" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-6 chartlet-f-7 chartlet-emph-quiet"><polyline points="456,980 456,1002.4 464,1002.4 464,1084" class="chartlet-flow-edge chartlet-flow-main"><title>Deploy to staging → Approved?</title></polyline><polyline points="460.5,1084 464,1092 467.5,1084 460.5,1084" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-7 chartlet-f-8 chartlet-emph-quiet"><polyline points="464,1156 464,1244" class="chartlet-flow-edge chartlet-flow-main"><title>Approved? → Deploy to production: yes</title></polyline><polyline points="460.5,1244 464,1252 467.5,1244 460.5,1244" class="chartlet-flow-head chartlet-flow-main-head"/></g><g class="chartlet-f chartlet-f-1 chartlet-f-7 chartlet-emph-quiet"><polyline points="488,1102.105 488,1002.4 544,1002.4 544,846.4 464,846.4 464,630.4 424,630.4 424,526.4 384,526.4 384,344 128,344 128,280" class="chartlet-flow-edge chartlet-flow-dashed"><title>Approved? → Code review: changes requested</title></polyline><polyline points="131.5,280 128,272 124.5,280 131.5,280" class="chartlet-flow-head"/></g><g class="chartlet-f chartlet-f-8 chartlet-f-9 chartlet-emph-quiet"><polyline points="464,1292 464,1328" class="chartlet-flow-edge chartlet-flow-main"><title>Deploy to production → Released</title></polyline><polyline points="460.5,1328 464,1336 467.5,1328 460.5,1328" 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 chartlet-emph-quiet"><rect x="45.6" y="277" width="54.4" height="21" class="chartlet-diagram-chip"/><text x="95" y="291" text-anchor="end" class="chartlet-diagram-chip-text">merged</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-6 chartlet-emph-edge"><rect x="280" y="751" width="30.16" height="21" class="chartlet-diagram-chip"/><text x="285" y="765" text-anchor="start" class="chartlet-diagram-chip-text">yes</text></g><g class="chartlet-f chartlet-f-4 chartlet-f-5 chartlet-emph-quiet"><rect x="224.56" y="751" width="23.44" height="21" class="chartlet-diagram-chip"/><text x="243" y="765" text-anchor="end" class="chartlet-diagram-chip-text">no</text></g><g class="chartlet-f chartlet-f-2 chartlet-f-5 chartlet-emph-quiet"><rect x="56.4" y="914" width="43.6" height="21" class="chartlet-diagram-chip"/><text x="95" y="928" text-anchor="end" class="chartlet-diagram-chip-text">retry</text></g><g class="chartlet-f chartlet-f-7 chartlet-f-8 chartlet-emph-quiet"><rect x="468" y="1161" width="30.16" height="21" class="chartlet-diagram-chip"/><text x="473" y="1175" text-anchor="start" class="chartlet-diagram-chip-text">yes</text></g><g class="chartlet-f chartlet-f-1 chartlet-f-7 chartlet-emph-quiet"><rect x="362.64" y="1068" width="121.36" height="21" class="chartlet-diagram-chip"/><text x="479" y="1082" text-anchor="end" class="chartlet-diagram-chip-text">changes requested</text></g><g class="chartlet-f chartlet-n-0 chartlet-f-0 chartlet-f-1"><polyline points="148,150.5 155.654,152.022 162.142,156.358 166.478,162.846 168,170.5 166.478,178.154 162.142,184.642 155.654,188.978 148,190.5 60,190.5 52.346,188.978 45.858,184.642 41.522,178.154 40,170.5 41.522,162.846 45.858,156.358 52.346,152.022 60,150.5 148,150.5" class="chartlet-diagram-shadow"/><polyline points="148,148 155.654,149.522 162.142,153.858 166.478,160.346 168,168 166.478,175.654 162.142,182.142 155.654,186.478 148,188 60,188 52.346,186.478 45.858,182.142 41.522,175.654 40,168 41.522,160.346 45.858,153.858 52.346,149.522 60,148 148,148" class="chartlet-flow-node chartlet-flow-start chartlet-role-green"><title>Commit pushed</title></polyline><text x="104" y="172.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="52" y="234.5" width="104" height="40" class="chartlet-diagram-shadow"/><rect x="52" y="232" width="104" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Code review</title></rect><text x="104" y="256.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="200" y="450.5" width="104" height="56" class="chartlet-diagram-shadow"/><rect x="200" y="448" width="104" height="56" class="chartlet-flow-node chartlet-role-blue"><title>Build – locked inputs</title></rect><text x="252" y="473.5" text-anchor="middle" class="chartlet-flow-label">Build</text><text x="252" y="487.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="224" y="570.5" width="104" height="40" class="chartlet-diagram-shadow"/><rect x="224" y="568" width="104" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Run tests</title></rect><text x="276" y="592.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 chartlet-emph"><polyline points="276,674.5 352,706.5 276,738.5 200,706.5 276,674.5" class="chartlet-diagram-shadow"/><polyline points="276,672 352,704 276,736 200,704 276,672" class="chartlet-flow-node chartlet-role-amber"><title>All green?</title></polyline><text x="276" y="708.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="64" y="942.5" width="104" height="40" class="chartlet-diagram-shadow"/><rect x="64" y="940" width="104" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Fix failures</title></rect><text x="116" y="964.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="384" y="942.5" width="144" height="40" class="chartlet-diagram-shadow"/><rect x="384" y="940" width="144" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Deploy to staging</title></rect><text x="456" y="964.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="464,1094.5 540,1126.5 464,1158.5 388,1126.5 464,1094.5" class="chartlet-diagram-shadow"/><polyline points="464,1092 540,1124 464,1156 388,1124 464,1092" class="chartlet-flow-node chartlet-role-amber"><title>Approved?</title></polyline><text x="464" y="1128.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="384" y="1254.5" width="160" height="40" class="chartlet-diagram-shadow"/><rect x="384" y="1252" width="160" height="40" class="chartlet-flow-node chartlet-role-blue"><title>Deploy to production</title></rect><text x="464" y="1276.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="496,1338.5 503.654,1340.022 510.142,1344.358 514.478,1350.846 516,1358.5 514.478,1366.154 510.142,1372.642 503.654,1376.978 496,1378.5 432,1378.5 424.346,1376.978 417.858,1372.642 413.522,1366.154 412,1358.5 413.522,1350.846 417.858,1344.358 424.346,1340.022 432,1338.5 496,1338.5" class="chartlet-diagram-shadow"/><polyline points="496,1336 503.654,1337.522 510.142,1341.858 514.478,1348.346 516,1356 514.478,1363.654 510.142,1370.142 503.654,1374.478 496,1376 432,1376 424.346,1374.478 417.858,1370.142 413.522,1363.654 412,1356 413.522,1348.346 417.858,1341.858 424.346,1337.522 432,1336 496,1336" class="chartlet-flow-node chartlet-flow-end chartlet-role-green"><title>Released</title></polyline><text x="464" y="1360.5" text-anchor="middle" class="chartlet-flow-label">Released</text></g><g class="chartlet-legend-strip"><polyline points="42,1506.5 45.061,1507.109 47.657,1508.843 49.391,1511.439 50,1514.5 49.391,1517.561 47.657,1520.157 45.061,1521.891 42,1522.5 32,1522.5 28.939,1521.891 26.343,1520.157 24.609,1517.561 24,1514.5 24.609,1511.439 26.343,1508.843 28.939,1507.109 32,1506.5 42,1506.5" class="chartlet-diagram-shadow"/><polyline points="42,1504 45.061,1504.609 47.657,1506.343 49.391,1508.939 50,1512 49.391,1515.061 47.657,1517.657 45.061,1519.391 42,1520 32,1520 28.939,1519.391 26.343,1517.657 24.609,1515.061 24,1512 24.609,1508.939 26.343,1506.343 28.939,1504.609 32,1504 42,1504" class="chartlet-flow-node chartlet-flow-start chartlet-role-green"/><text x="58" y="1516" text-anchor="start" class="chartlet-legend-text">Start</text><polyline points="132.92,1506.5 135.981,1507.109 138.577,1508.843 140.311,1511.439 140.92,1514.5 140.311,1517.561 138.577,1520.157 135.981,1521.891 132.92,1522.5 122.92,1522.5 119.859,1521.891 117.263,1520.157 115.529,1517.561 114.92,1514.5 115.529,1511.439 117.263,1508.843 119.859,1507.109 122.92,1506.5 132.92,1506.5" class="chartlet-diagram-shadow"/><polyline points="132.92,1504 135.981,1504.609 138.577,1506.343 140.311,1508.939 140.92,1512 140.311,1515.061 138.577,1517.657 135.981,1519.391 132.92,1520 122.92,1520 119.859,1519.391 117.263,1517.657 115.529,1515.061 114.92,1512 115.529,1508.939 117.263,1506.343 119.859,1504.609 122.92,1504 132.92,1504" class="chartlet-flow-node chartlet-flow-end chartlet-role-green"/><text x="148.92" y="1516" text-anchor="start" class="chartlet-legend-text">End</text><rect x="192.4" y="1506.5" width="26" height="16" class="chartlet-diagram-shadow"/><rect x="192.4" y="1504" width="26" height="16" class="chartlet-flow-node chartlet-role-blue"/><text x="226.4" y="1516" text-anchor="start" class="chartlet-legend-text">Step</text><polyline points="289.6,1506.5 302.6,1514.5 289.6,1522.5 276.6,1514.5 289.6,1506.5" class="chartlet-diagram-shadow"/><polyline points="289.6,1504 302.6,1512 289.6,1520 276.6,1512 289.6,1504" class="chartlet-flow-node chartlet-role-amber"/><text x="310.6" y="1516" text-anchor="start" class="chartlet-legend-text">Decision</text><rect x="381.44" y="1504" width="26" height="16" class="chartlet-legend-emph"/><text x="415.44" y="1516" text-anchor="start" class="chartlet-legend-text">Emphasized</text><line x1="24" y1="1536" x2="50" y2="1536" class="chartlet-legend-line"/><text x="58" y="1540" text-anchor="start" class="chartlet-legend-text">Solid line</text><line x1="133.16" y1="1536" x2="159.16" y2="1536" class="chartlet-legend-line chartlet-legend-dashed"/><text x="167.16" y="1540" text-anchor="start" class="chartlet-legend-text">Dashed line</text><line x1="255.28" y1="1536" x2="281.28" y2="1536" class="chartlet-legend-line chartlet-legend-path"/><text x="289.28" y="1540" text-anchor="start" class="chartlet-legend-text">Emphasized path</text></g></svg><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-m-hs-0" for="chartlet-d13bc95ed4c499e1-focus-0"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-m-hs-1" for="chartlet-d13bc95ed4c499e1-focus-1"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-m-hs-2" for="chartlet-d13bc95ed4c499e1-focus-2"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-m-hs-3" for="chartlet-d13bc95ed4c499e1-focus-3"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-m-hs-4" for="chartlet-d13bc95ed4c499e1-focus-4"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-m-hs-5" for="chartlet-d13bc95ed4c499e1-focus-5"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-m-hs-6" for="chartlet-d13bc95ed4c499e1-focus-6"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-m-hs-7" for="chartlet-d13bc95ed4c499e1-focus-7"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-m-hs-8" for="chartlet-d13bc95ed4c499e1-focus-8"></label><label class="chartlet-hotspot" id="chartlet-d13bc95ed4c499e1-m-hs-9" for="chartlet-d13bc95ed4c499e1-focus-9"></label></div></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: the quality gate</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><th scope="col">Emphasis</th></tr></thead><tbody><tr><th scope="row">Commit pushed</th><td>start</td><td>Development</td><td></td><td>Code review</td><td></td></tr><tr><th scope="row">Code review</th><td>step</td><td>Development</td><td></td><td>Build (merged)</td><td></td></tr><tr><th scope="row">Build</th><td>step</td><td>Continuous integration</td><td>Quality gates</td><td>Run tests</td><td>on emphasized path</td></tr><tr><th scope="row">Run tests</th><td>step</td><td>Continuous integration</td><td>Quality gates</td><td>All green?</td><td>on emphasized path</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><td>emphasized, on emphasized path</td></tr><tr><th scope="row">Fix failures</th><td>step</td><td>Development</td><td></td><td>Build (retry)</td><td></td></tr><tr><th scope="row">Deploy to staging</th><td>step</td><td>Operations</td><td></td><td>Approved?</td><td>on emphasized path</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><td></td></tr><tr><th scope="row">Deploy to production</th><td>step</td><td>Operations</td><td></td><td>Released</td><td></td></tr><tr><th scope="row">Released</th><td>end</td><td>Operations</td><td></td><td></td><td></td></tr></tbody></table></details></figure></div>