The Ops Atlas xOps School

Delivery & Platform Established term Sources verified

DevOps

DevOps is a way of organising software delivery so that the people who build a service and the people who run it share goals, tools and feedback, letting changes reach users quickly, safely and repeatedly. It is judged by delivery outcomes, not job titles.

Key takeaways

  • DevOps is a socio-technical system of shared ownership, fast flow and fast feedback; automation serves it.
  • Measure each service with DORA's five delivery metrics and compare it with its own past, never with other teams.
  • The technical core: small batches, trunk-based development, CI, test and deployment automation, observability.
  • DORA found no evidence that heavyweight change approval lowers failure rates; recorded peer review can meet segregation of duties.
  • A permanent DevOps team between Dev and Ops usually becomes one more silo.
  • AI coding assistants amplify the delivery system they land in, good or bad.

DevOps is a way of organising software delivery so that building a service and running it are one continuous responsibility. The people who change the system share goals, tools and feedback with the people who keep it running, and often they are the same people. Small changes reach users quickly and safely, failures are noticed and fixed fast, and the organisation learns from both.

Developers are often rewarded for shipping change and operations staff for stability, so each side optimises against the other. DevOps aligns both around the flow of value to users, automates the path from commit to production, makes the results visible, and treats incidents as information rather than occasions for blame. Success is measured by delivery outcomes: DORA, Google Cloud’s long-running research programme, uses five metrics for how fast changes flow and how often deployments go wrong.[1]

There is no single official definition, and the commonly cited ones stress different things:

  • Microsoft describes DevOps as combining development and operations “to unite people, process, and technology in application planning, development, delivery, and operations”.[2]
  • Bass, Weber and Zhu, in DevOps: A Software Architect’s Perspective (2015),[3] define it as “a set of practices intended to reduce the time between committing a change to a system and the change being placed into normal production, while ensuring high quality” (wording checked as quoted by Wikipedia).[4]
  • Jez Humble, co-author of Accelerate,[5] put its essence as designing “a system in which people are held responsible for the consequences of their actions”.[6]

This page uses all three: shared ownership, the commit-to-production path and the whole lifecycle.

Item Summary
Goal Deliver changes to users quickly, safely and sustainably, and learn from the outcome
Primary users Product, platform and operations engineers; engineering managers; technology leaders
Scope (this page) CALMS and the Three Ways, value streams, CI/CD, trunk-based development, test and deployment automation, the DORA measurement model, team structures
Out of scope (linked) PlatformOps, SRE, DevSecOps, ReleaseOps, GitOps, InfraOps, DevExOps, TestOps, AgileOps: see how DevOps relates to other Ops
Prerequisites Basic Git, what builds and automated tests are, roughly how software runs in production
Key outputs A deployable trunk, an automated pipeline, deployment and incident records, five metrics per service, clear ownership
Term status Established. DORA research since 2014;[7] devopsdays since 2009;[8] Accelerate (2018) and The DevOps Handbook (2nd ed. 2021).[5][9] Job titles built on the word are contested

The classic pathology is a wall between development and operations. Werner Vogels, Amazon’s CTO, described the traditional model in 2006 as one where “you take your software to the wall that separates development and operations” and then stop thinking about it.[10] The symptoms:

  • Large, infrequent releases. Each release bundles months of change, so each is risky; risk invites more approval steps, which make releases larger still. DORA describes this loop: responding to instability with more process increases lead times and batch sizes.[11]
  • Integration hell. Long-lived branches diverge, and merging them needs code freezes and “integration phases”.[12]
  • Hand-offs without context. Operations runs software it did not help design: DevOps Topologies’ anti-type A, “Dev and Ops silos”.[13]
  • Blame-driven incident response. When failure leads to scapegoating, people hide bad news and the organisation stops learning: the “pathological” culture in Westrum’s typology, which DORA uses.[14]
  • Manual, unrepeatable deployments, run late at night by tired people.
Figure 1. From a wall between Dev and Ops to shared ownership of one value stream
After: one team owns the service end to endsmall change, many times aweektelemetry and incidentsas a serviceProduct team builds and runsthe serviceAutomated pipeline tests,checks, deploysProductionPlatform team self-servicepaved roadBefore: functional silosrelease bundle every fewmonthstickets and blameadds wait timeDevelopers rewarded forchangeHand-off wallOperations rewarded forstabilityChange advisory board(CAB)
Diagram source (Mermaid)
flowchart TB
  subgraph BEFORE["Before: functional silos"]
    direction TB
    D1["Developers rewarded for change"] -->|"release bundle every few months"| W{{"Hand-off wall"}}
    W --> O1["Operations rewarded for stability"]
    O1 -->|"tickets and blame"| D1
    C1["Change advisory board (CAB)"] -.->|"adds wait time"| W
  end
  subgraph AFTER["After: one team owns the service end to end"]
    direction TB
    T["Product team builds and runs the service"] -->|"small change, many times a week"| P["Automated pipeline tests, checks, deploys"]
    P --> PR["Production"]
    PR -->|"telemetry and incidents"| T
    PL["Platform team self-service paved road"] -.->|"as a service"| P
  end
  BEFORE ~~~ AFTER
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class D1,O1,W,C1 risk
  class T,P,PR core
  class PL neutral

Text equivalent: Two panels, “before” above “after”. Before: developers rewarded for change pass a large release bundle every few months across a hand-off wall to operations, who are rewarded for stability; operations sends tickets and blame back, and a change advisory board (CAB) adds waiting time at the wall. After: one product team builds and runs the service, sends small changes many times a week through an automated pipeline into production, and gets telemetry and incidents straight back. A platform team supplies the pipeline as a self-service product.

What it costs not to change. Published savings figures vary too much by context to quote, so build your own case from four costs: delay (cost of delay); failure, because large batches fail more expensively; people, because DORA reports that strong continuous delivery predicts lower burnout and less “deployment pain”;[15] and learning, because a quarterly release gives four chances a year to learn whether ideas work.

Not a tool, product or job title you can buy. John Willis put culture first: “People and process first. If you don’t have culture, all automation attempts will be fruitless”.[16] DORA warns that modern tooling without the technical practices and process change “won’t produce the expected benefits”.[15]

Not developers doing operations so that Ops can be cut. DevOps Topologies calls this anti-type C, “Dev don’t need Ops”, which underestimates how complex operations is.[13] Operational expertise moves and is shared; it does not disappear (see NoOps for that aspiration).

Not a separate team between Dev and Ops. Humble argued in 2012 that a “DevOps team” placed between development and operations creates exactly the silo DevOps exists to remove; he accepted the label only for people who build a self-service platform and toolchain and coach other teams.[6] DevOps Topologies lists the “DevOps team silo” as anti-type B, sensible only when it is temporary (“less than (say) 12 or 18 months”) and mandated to make itself unnecessary.[13]

Not one job description. A “DevOps engineer” advertisement can mean a build, cloud or platform engineer or an SRE, so read the responsibilities. The rebranded sysadmin (anti-type E) and the DevOps tools team building pipelines in isolation (anti-type D)[13] are fine as job categories and wrong as transformation strategies, because the hand-off remains.

Not just CI/CD, and not a synonym. DORA’s capability catalogue (34 capabilities in October 2026) also covers culture, leadership, documentation, team structure and well-being.[17] DevOps extends Agile thinking through release and operation; the SRE Workbook frames SRE as “class SRE implements interface DevOps”;[18] platform engineering makes DevOps practices cheap to adopt.[19]

Not the EU regulation. In finance, “DORA” also means the EU Digital Operational Resilience Act, Regulation (EU) 2022/2554, applicable since 17 January 2025 to financial entities and their ICT third-party providers.[20] It is unrelated to the DORA metrics, so say which one you mean.

Sourced milestones only; not a complete timeline.

  • 1968. Mel Conway’s “How Do Committees Invent?” (Datamation): a system’s design copies its organisation’s communication structure.[21]
  • 2000. Martin Fowler’s “Continuous Integration” (revised in 2024) popularises merging at least daily with a self-testing build.[22]
  • 2006. Werner Vogels: “You build it, you run it.” Introducing the interview, AWS’s Jeff Barr added that a new developer’s manager “may very well hand you a pager that same day”.[10]
  • 2008. Patrick Debois runs an “Agile Infrastructure” session at the Agile conference in Toronto and meets Andrew Shafer there (Debois’s own account).[23]
  • 2009. John Allspaw and Paul Hammond’s Velocity talk “10+ Deploys A Day: Devs & Ops Cooperation at Flickr”;[24] the first devopsdays, in Ghent, founded by Patrick Debois.[8]
  • 2010. John Willis’s “What DevOps Means to Me” sets out CAMS (Culture, Automation, Measurement, Sharing);[16] Lean was added later to make CALMS.[18]
  • 2012. Gene Kim’s article on “The Three Ways”, the principles from which DevOps practices are derived.[25]
  • 2014–2025. DORA’s annual reports turn DevOps from anecdote into measured, if correlational, evidence.[7]
  • 2018. Accelerate by Forsgren, Humble and Kim;[5] DORA joins Google Cloud (announced 2018-12-20).[26]
  • 2023–2024. DORA renames “time to restore” as failed deployment recovery time, narrowed to change-caused failures (2023), and adds deployment rework rate as a fifth metric (2024).[27]
  • 2025. DORA’s State of AI-assisted Software Development: AI acts as “an amplifier, magnifying an organization’s existing strengths and weaknesses”.[28]

The mental model: a delivery system with two loops. Picture a pipe with a feedback loop: work flows from idea to production to user, and information flows back from telemetry, incidents and user behaviour. DevOps makes the pipe short and smooth (flow) and the loop fast and loud (feedback), in a culture that learns from it: Gene Kim’s Three Ways.[25] Almost every practice on this page removes friction from the pipe or speeds up the loop.

Key terms. The five delivery metrics are defined once, in the metrics part.

  • Value stream: all the steps from a customer need to its fulfilment in production (idea → code → review → test → deploy → monitor).
  • %C/A (percent complete and accurate): recorded at each step, the share of the work it receives that it can use without rework;[29] a low value points upstream.
  • Batch size: how much change moves through the system at once: a 50-line pull request, not a 5,000-line branch.
  • Trunk-based development: developers merge small changes to the trunk (main) at least daily, with three or fewer active branches.[12]
  • Continuous integration (CI): everyone merges to the mainline at least daily, and every push triggers a self-testing build.[22]
  • Continuous delivery (CD): software is kept deployable, so any version can be released on demand;[30] release becomes a business decision.
  • Deployment versus release: deployment installs code in production; release exposes it to users, for example through a flag.
  • Canary: “A partial and time-limited deployment of a change in a service and its evaluation”[31] (strategies: ReleaseOps).
  • Feature toggle (flag): a runtime switch that changes behaviour without a deployment.[32]
  • Artifact: the immutable, versioned build output; DORA advises “the same packages for every environment”.[33]
  • Smoke test: a quick post-deployment check that the system works and its dependencies are reachable.[33]
  • Shift left: moving quality and security checks earlier, where problems are cheaper to fix.
  • Percentile (p50, p90): the value below which 50% (the median) or 90% of observations fall; p90 shows the slow tail.
  • Roll back versus fix forward: redeploy the previous artifact, or ship a new change that repairs the fault.
  • Generative culture: Westrum’s “performance-oriented” culture: high cooperation, messengers trained, failure leads to inquiry.[14]
  • Transformational leadership: vision, inspirational communication, intellectual stimulation, support and recognition; a DORA capability.[34]
  • J-curve: early gains, then a dip, then recovery to a higher level; DORA describes this shape for both continuous delivery and platform engineering, with different causes of the dip.[15][19]
  • Segregation of duties (SoD): the author of a change is not its only approver (risk controls); a change advisory board (CAB) is one way of approving changes (ITOps).

DevOps is the hub of the Atlas’s delivery pages: it owns the culture, the pipeline and the measurement model, and neighbours specialise. The boundaries are editorial distinctions, not industry standards; one real team often does several of these jobs.

Figure 2. DevOps as the hub of the delivery and operations pages
AgileOps: planned workenters the value streamITOps: change-governanceinterface (ITIL)DevOps: culture, flow, CI/CD,DORA metricsSRE: takes reliability targets(SLOs, error budgets)DevSecOps: security gates inthe pipelineReleaseOps: how changesare exposedGitOps: one pull-baseddeployment mechanismInfraOps: environments ascodeTestOps: a trustworthy testsignalPlatformOps: builds thepaved road as a productDevExOps: finds developerfriction
Diagram source (Mermaid)
flowchart LR
  AG["AgileOps: planned work enters the value stream"]
  IT["ITOps: change-governance interface (ITIL)"]
  DEV["DevOps: culture, flow, CI/CD, DORA metrics"]
  SRE["SRE: takes reliability targets (SLOs, error budgets)"]
  SEC["DevSecOps: security gates in the pipeline"]
  REL["ReleaseOps: how changes are exposed"]
  GIT["GitOps: one pull-based deployment mechanism"]
  INF["InfraOps: environments as code"]
  TEST["TestOps: a trustworthy test signal"]
  PLAT["PlatformOps: builds the paved road as a product"]
  DX["DevExOps: finds developer friction"]
  AG --> DEV
  IT --> DEV
  DEV --> SRE
  DEV --> SEC
  DEV --> REL
  DEV --> GIT
  DEV --> INF
  DEV --> TEST
  DEV --> PLAT
  DX --> PLAT
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class DEV core
  class SRE,PLAT,DX,SEC,REL,GIT,INF,TEST,AG,IT neutral

Text equivalent: AgileOps (planned work) and ITOps (change governance) feed DevOps (culture, flow, CI/CD, DORA metrics), which hands off to SRE (reliability targets), DevSecOps (security gates), ReleaseOps (exposure), GitOps (one pull-based deployment mechanism), InfraOps (environments as code), TestOps (test signal) and PlatformOps (the paved road as a product). DevExOps sends developer friction findings to PlatformOps, not to DevOps.

Neighbouring page Its unique focus Choose it when…
SRE SLOs, error budgets, toil limits; SRE “implements some of the philosophy that DevOps describes”[18] Reliability targets must govern release pace
PlatformOps The internal platform as a product[19] Many teams repeat the same pipeline work
DevExOps Diagnosing developer friction with surveys and system data You cannot tell where engineers lose time
DevSecOps Threat modelling, scanning, supply chain, proportionate gates You must prove security controls without stalling delivery
ReleaseOps Canary, blue-green, progressive delivery, release trains The problem is exposing change safely
GitOps Pull-based, continuously reconciled desired state Declarative platforms where drift correction matters
InfraOps IaC state, drift, modules, golden images Environment provisioning is the bottleneck
TestOps Flaky tests, test data, test signal quality Tests make the pipeline slow or untrustworthy
ITOps ITIL practices, change enablement, CMDB Delivery must fit enterprise IT service management
AgileOps Planning cadences, WIP limits, Kanban lead time Work waits before it reaches the code

IncidentOps (live incidents) and ObservabilityOps (telemetry) are neighbours too; DevOps uses both and teaches neither. These are not competitors. DevOps defines the delivery system and its measures, with the value stream and the owning team as its unit; SRE sets reliability targets inside it, platform engineering makes it cheap to adopt, DevSecOps secures it, GitOps is one way to deploy within it, and IT service management connects it to enterprise governance.

CAMS and CALMS. John Willis’s 2010 post set out Culture, Automation, Measurement and Sharing, calling sharing “the loopback in the CAMS cycle”.[16] Google’s SRE Workbook credits Willis, Damon Edwards and Jez Humble with CALMS, which adds Lean.[18] As a diagnostic, one warning sign per pillar: incidents end with a name (Culture); one person can deploy (Automation); work waits days for review (Lean); dashboards nobody discusses (Measurement); every team writes its own pipeline (Sharing).

The Three Ways (Gene Kim, 2012).[25] (1) Flow: optimise “the performance of the entire system, as opposed to the performance of a specific silo”. (2) Amplify feedback: create “the right to left feedback loops”. (3) Continual experimentation and learning: take risks, learn from failure, and practise, because repetition is “the prerequisite to mastery”.

Figure 3. The Three Ways as one delivery loop
Idea or hypothesisSmall change committed totrunkAutomated build, test anddeployRunning in productionUsers and business outcomeSecond Way: usage feedbackSecond Way: telemetry andalertsThird Way: blameless reviewsand experiments
Diagram source (Mermaid)
---
config:
  flowchart:
    nodeSpacing: 30
    rankSpacing: 35
---
flowchart TB
  IDEA["Idea or hypothesis"] --> CODE["Small change committed to trunk"]
  CODE --> PIPE["Automated build, test and deploy"]
  PIPE --> PROD["Running in production"]
  PROD --> USER["Users and business outcome"]
  IDEA ~~~ UF
  CODE ~~~ TEL
  PIPE ~~~ LEARN
  USER -.-> UF["Second Way: usage feedback"]
  UF -.-> IDEA
  PROD -.-> TEL["Second Way: telemetry and alerts"]
  TEL -.-> CODE
  PROD -.-> LEARN["Third Way: blameless reviews and experiments"]
  LEARN -.-> PIPE
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class IDEA,CODE,PIPE,PROD,USER core
  class TEL,UF neutral
  class LEARN decision

Text equivalent: First Way (solid arrows, top to bottom): idea or hypothesis → small change committed to trunk → automated build, test and deploy → running in production → users and business outcome. Second Way (dashed arrows into grey boxes): production sends telemetry and alerts back to the code, and users’ usage feedback returns to the next idea. Third Way (dashed arrows into the amber box): production feeds blameless reviews and experiments, which improve the build, test and deploy system.

Continuous delivery principles (Jez Humble): build quality in; work in small batches; computers perform repetitive tasks and people solve problems; relentlessly pursue continuous improvement; everyone is responsible.[35] There is no official “DevOps Manifesto” comparable to the Agile Manifesto, and this page does not invent one.

Invariants. Every production change is traceable to a reviewed commit, a build and a deployment record; the same artifact is promoted through every environment;[33] rollback is possible within minutes, and practised; a deployment without monitoring is not finished. The main trade-offs:

Tension Resolution pattern
Speed versus stability They tend to move together: “Top performers do well across all five metrics”.[1] Where they conflict, an error budget makes the trade explicit (SRE)
Autonomy versus standardisation Optional paved roads that are the easiest path; avoid a rigid “golden cage”[19]
Ownership versus cognitive load Platform and enabling teams absorb undifferentiated complexity[37]
Control versus flow Automate low-risk approvals; focus human review where risk is high[11]

A DevOps capability rests on four layers, each depending on the one below:

  1. Foundations: version control for everything, including pipeline and monitoring configuration;[36][38] a single trunk; code review (repository, CODEOWNERS, branch protection).
  2. Flow: CI, test automation, trunk-based development, small batches, feature toggles, deployment automation (pipeline definition, test suites, versioned artifacts).
  3. Feedback: observability, deployment records, incident reviews, delivery metrics, value stream maps.
  4. Organisation: stream-aligned teams with clear ownership, platform and enabling teams, generative culture, leadership that funds improvement (service catalogue, on-call rotas, improvement backlog).

Culture is not a soft extra: DORA’s 2023 report found that generative cultures “correlate with 30% higher organizational performance”, and user-focused teams achieve 40% higher organisational performance (survey correlations).[39][14] Continuous delivery alone draws on 14 technical capabilities in DORA’s catalogue;[15] find the one holding you back.

Architecture matters as much as tooling. Conway’s law predicts that a system’s design copies the organisation’s communication structure,[21] so if five teams must coordinate to ship one change, the architecture is the bottleneck. DORA’s loose-coupling test: can a team test and deploy its service independently, in business hours, with negligible downtime?[40] Citing its 2021 report, DORA adds that “elite” teams (that year’s top cluster) meeting their reliability targets were three times more likely to have adopted such an architecture.[15]

This page uses Team Topologies’ vocabulary: four team types (stream-aligned, the default, aligned to a flow of work from a segment of the business; enabling; complicated-subsystem; platform), three interaction modes (collaboration, X-as-a-Service, facilitation), and cognitive load as a design constraint, because “overloaded teams make poor decisions and move slowly”.[37]

Figure 4. Who does what: team types and interaction modes in a DevOps organisation
feedbackSecurity andcompliance: policy asautomated checksEngineering leadership:funds improvement,removes blockersEnabling team:time-boxed facilitationon testing, CI, incidentreviewsPlatform team: pipeline,runtime andobservabilityX-as-a-ServiceSRE specialists:collaboration on SLOsStream-aligned team:checkout (builds andruns it)Stream-aligned team:search (builds and runsit)
Diagram source (Mermaid)
---
config:
  flowchart:
    nodeSpacing: 30
    wrappingWidth: 160
---
flowchart TB
  SECT["Security and compliance: policy as automated checks"]
  LEAD["Engineering leadership: funds improvement, removes blockers"]
  ENAB["Enabling team: time-boxed facilitation on testing, CI, incident reviews"]
  PLATF["Platform team: pipeline, runtime and observability X-as-a-Service"]
  SRET["SRE specialists: collaboration on SLOs"]
  S1["Stream-aligned team: checkout (builds and runs it)"]
  S2["Stream-aligned team: search (builds and runs it)"]
  SECT --> PLATF
  LEAD ~~~ PLATF
  ENAB -.-> S1
  PLATF --> S1
  PLATF --> S2
  SRET -.-> S2
  LEAD --> S1
  LEAD --> S2
  S2 -.->|"feedback"| PLATF
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  class S1,S2 core
  class PLATF,ENAB,SRET,SECT neutral
  class LEAD decision

Text equivalent: Two stream-aligned teams (checkout, search) build and run their services. Solid arrows are ongoing service; dashed arrows are time-boxed or two-way. Security and compliance put policy into the platform as automated checks; the platform team serves both teams X-as-a-Service and gets feedback (drawn from the search team); an enabling team coaches the checkout team for a limited time; SRE specialists collaborate with the search team on SLOs; leadership funds improvement and removes blockers for both.

The RACI below (R = responsible, A = accountable, C = consulted, I = informed) is an illustrative default; in small organisations one person holds several roles.

Activity Stream-aligned team Platform team Security / compliance Engineering leadership
Write, review and merge changes to a service A, R I C (high-risk changes) I
Keep trunk green; fix or revert broken builds A, R C (pipeline faults) I I
Provide and run the shared CI/CD platform C A, R C I
Define automated security and compliance checks C R (implement) A I
Deploy to production A, R (self-service) C I I
Be on call for the service A, R R (for the platform itself) I I
Measure the five delivery metrics per service R (review) R (instrument) I A (use for investment)
Fund and prioritise improvement work C C C A, R
Approve exceptions to policy R (requests and documents) C C A (business risk owner)

Microsoft describes the loop as plan, develop, deliver and operate, and stresses that “the phases aren’t role-specific”.[2] For one service:

Stage What happens Exit criterion
Day 0: build the path Name the owner; create the repository from a template; set up pipeline, environments, health endpoint, dashboards and runbooks before the first feature A trivial change reaches production with no manual steps
Day 1: first release Ship behind feature flags; verify telemetry; practise rollback once; start the baseline metrics Rollback rehearsed; alerts reach the owning team
Day 2: operate and improve Daily small changes, on-call, incident reviews, dependency updates, monthly delivery review Continuous, until retirement
Retirement Migrate consumers; remove flags and pipelines; archive data by policy No traffic, no cost, no on-call

A costly mistake is to skip Day 0 and bolt the pipeline on after months of untested code and manual steps.

Ownership. Every service has exactly one owning team in a service catalogue, including on-call, security patches and cost.

Flow policies (defaults any exception must justify): small pull requests reviewed promptly, ideally synchronously, because days-long review pushes developers away from small batches; branches under a day old, three or fewer active, no code freezes;[12] a broken trunk fixed or reverted within minutes.[36]

Ceremonies (a minimal set).

Ceremony Cadence Participants Output
Daily stand-up includes pipeline and production health Daily Team Red builds and alerts get owners
Post-incident review After every significant incident Team plus affected parties System-level actions (mechanics: IncidentOps)
Delivery review Monthly, per service or team Team, platform representative, manager Five-metric trend, chosen constraint, one improvement experiment
Value stream mapping Every 6 months, as DORA suggests[29] Everyone in the stream, from business to support Current and future-state map
Platform roadmap review Quarterly Platform team and its internal customers Prioritised platform backlog

Escalation. A constraint a team cannot fix (a shared database, a central approval, a platform gap) goes to the delivery review owner, then after two reviews to engineering leadership, with the metric evidence attached.

Prefer controls that run on every change and leave evidence. This is the page’s one explanation of segregation of duties.

  • Segregation of duties through recorded peer review. Many regimes require that a change’s author is not its only approver. DORA notes that peer review recorded in the development platform can satisfy this, so a separate external approval body is not needed for that purpose.[11] Whether your auditor or regulator agrees is their decision: bring evidence (each review linked to its build and deployment), and remember that a rubber-stamp review destroys the control.
  • Automated checks: tests, security and policy checks in the pipeline (DevSecOps).
  • Risk tiers. Standard changes promote automatically; high-risk ones (schema migrations on critical data, authentication) get human review through a deployment approval or equivalent gate that your platform plan actually provides (see the reference implementation).
  • A re-chartered CAB focuses on coordination, process improvement and business trade-offs, not routine approvals.[11] Enterprise change enablement: ITOps.

The delivery system below is technology-neutral: every box is a responsibility, and the tooling landscape lists ways to fill it. The four zones are trust boundaries, so every arrow that crosses between zones needs its own access control and audit trail. Dashed arrows show feedback and runtime control rather than the flow of the change.

Figure 5. Reference architecture of a DevOps delivery system
Feedback zoneRuntime zoneSource and build zoneDeveloper zonepush small changewebhookpublish oncesame artifactafter checks passruntime exposuredeployment eventincident and recovery eventsalertsmonthly reviewOwning team's workstation:code, local testsVersion control: trunk,reviews, branch protectionCI runners: build, unit andintegration testsPolicy and security checksArtifact registry: immutable,versionedDeployment orchestratorStaging environmentProduction environmentFeature flag service: aproduction controlObservability: metrics, logs,traces, alertsDelivery records:deployments, incidentsFive delivery metrics perservice
Diagram source (Mermaid)
---
config:
  flowchart:
    nodeSpacing: 30
    rankSpacing: 40
---
flowchart TB
  subgraph DEVZONE["Developer zone"]
    IDE["Owning team's workstation: code, local tests"]
  end
  subgraph CIZONE["Source and build zone"]
    VCS["Version control: trunk, reviews, branch protection"]
    CI["CI runners: build, unit and integration tests"]
    CHK["Policy and security checks"]
    REG["Artifact registry: immutable, versioned"]
  end
  subgraph RUNZONE["Runtime zone"]
    CD["Deployment orchestrator"]
    STG["Staging environment"]
    PRD["Production environment"]
    FLAG["Feature flag service: a production control"]
  end
  subgraph FBZONE["Feedback zone"]
    OBS["Observability: metrics, logs, traces, alerts"]
    REC["Delivery records: deployments, incidents"]
    MET["Five delivery metrics per service"]
  end
  IDE -->|"push small change"| VCS
  VCS -->|"webhook"| CI
  CI --> CHK
  CHK -->|"publish once"| REG
  REG -->|"same artifact"| CD
  CD --> STG
  CD -->|"after checks pass"| PRD
  FLAG -.->|"runtime exposure"| PRD
  PRD --> OBS
  CD -->|"deployment event"| REC
  OBS -->|"incident and recovery events"| REC
  REC --> MET
  OBS -.->|"alerts"| IDE
  MET -.->|"monthly review"| IDE
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  class VCS,CI,REG,CD core
  class IDE,STG,OBS,REC,MET neutral
  class CHK,PRD,FLAG risk

Text equivalent: Four zones, top to bottom. Developer zone: the owning team’s workstation pushes a small change to version control. Source and build zone: a webhook starts CI runners (build, tests), then policy and security checks, then one publish to an immutable artifact registry. Runtime zone: the deployment orchestrator takes that same artifact to staging and, after checks, to production; the feature-flag service also acts on production. Feedback zone: production feeds observability; deployment, incident and recovery events form the delivery records behind the five metrics. Dashed arrows return alerts and the monthly review to the owning team. Checks, production and the flag service are marked as risk points.

Component Key design rule Common failure
Version control Single source of truth for code, config, IaC, pipeline and monitoring; protected trunk, required review Configuration that lives only on servers
CI runners Build once; ephemeral, least-privilege runners; feedback in minutes[36] Long-lived shared runners holding production credentials
Policy and security checks Proportionate: every gate justifies its false-positive cost (DevSecOps) Gates nobody reads, which teach people to click “override”
Artifact registry Immutable outputs tagged by commit SHA; never overwrite a tag A mutable latest tag in production
Deployment orchestrator Same process for every environment;[33] push- or pull-based (GitOps) Different scripts for staging and production
Feature flag service A flag change is a production change: restricted and audited; every release toggle has an owner and expiry[32] Hundreds of stale flags anyone can flip unrecorded
Observability Symptom-based alerts routed to the owning team[38] Alerts to an email list nobody owns
Delivery records Machine-generated, not self-reported Spreadsheets filled in at month end
Decision Option A, when… Option B, when…
Deployment trigger Push (pipeline deploys): mixed targets such as VMs, serverless, SaaS config Pull (agent reconciles from Git, GitOps): declarative platforms needing drift correction
CI hosting Managed service: standard workloads, small platform team Self-hosted runners: data residency, special hardware, network isolation
Pipeline ownership Each team writes its own: few teams, high variety Shared templates (PlatformOps): many similar teams
Release exposure Deploy equals release: internal tools, low blast radius Dark deploy, release by flag or canary (ReleaseOps): user-facing or risky changes
Repository layout Many repositories: independent lifecycles Monorepo: heavily shared code, atomic cross-cutting changes, strong build tooling

One change from commit to production through a push-based pipeline with a canary step, including the failure path. Release strategies belong to ReleaseOps.

Figure 6. One change from commit to production, with the failure path
ObservabilityProductionDeploymentorchestratorPeerreviewerCI pipelineVersioncontrolalt[Health checks pass][Error rate or latency breaches threshold]Developer1. Push short-livedbranch, open pullrequest2. Build and fasttests3. Result in minutes4. Review and approve the small diff5. Merge to trunk6. Build artifactonce, full tests,checks7. Promote artifact to staging, smoketest passes8. Deploy a canaryslice first9. Metrics, logs,tracesCanary healthyComplete rollout,record deploymentCanary unhealthyRoll back toprevious artifactPage owning team with deployment IDFix forward orrevert in a newsmall change
Diagram source (Mermaid)
---
config:
  sequence:
    wrap: true
    width: 104
    actorMargin: 10
---
sequenceDiagram
  actor Dev as Developer
  participant VCS as Version control
  participant CI as CI pipeline
  participant Rev as Peer reviewer
  participant CD as Deployment orchestrator
  participant Prod as Production
  participant Obs as Observability
  Dev->>VCS: 1. Push short-lived branch, open pull request
  VCS->>CI: 2. Build and fast tests
  CI-->>Dev: 3. Result in minutes
  Rev->>VCS: 4. Review and approve the small diff
  Dev->>VCS: 5. Merge to trunk
  VCS->>CI: 6. Build artifact once, full tests, checks
  CI->>CD: 7. Promote artifact to staging, smoke test passes
  CD->>Prod: 8. Deploy a canary slice first
  Prod->>Obs: 9. Metrics, logs, traces
  alt Health checks pass
    Obs-->>CD: Canary healthy
    CD->>Prod: Complete rollout, record deployment
  else Error rate or latency breaches threshold
    Obs-->>CD: Canary unhealthy
    CD->>Prod: Roll back to previous artifact
    CD-->>Dev: Page owning team with deployment ID
    Dev->>VCS: Fix forward or revert in a new small change
  end

Text equivalent: (1) The developer pushes a short-lived branch and opens a pull request; (2) version control triggers a build and fast tests; (3) results return within minutes; (4) a peer approves the small diff; (5) the developer merges to trunk; (6) the pipeline builds the artifact once and runs the full tests and checks; (7) the artifact passes a smoke test in staging; (8) the orchestrator deploys a production canary slice; (9) production emits telemetry. If the canary is healthy, the rollout completes and the deployment is recorded. If error rate or latency breaches a threshold, the orchestrator rolls back to the previous artifact and pages the owning team with the deployment ID, and the developer fixes forward or reverts in a new small change.

Each step leaves a measurable trace (branch age, CI duration, review wait, smoke failures, deployment time, recovery), and the approval is the segregation-of-duties evidence.

Exception paths to design up front. Pipeline down: an audited break-glass path, reviewed every time it is used. Urgent security fix: the same pipeline and checks; in this Atlas’s view, an emergency path that skips tests removes the checks exactly when people are most rushed. Failed migration: backward-compatible database steps, so the application can roll back without a data rollback (Playbook 3 below).[41]

The core practices are CI, trunk-based development, test automation (with developers as the primary authors of acceptance tests[42]), deployment automation, small batches (work taking “longer than a week to complete and check is too big”[43]), feature toggles, team-owned observability, value stream mapping (Lab 1), streamlined change approval and blameless incident review. Their measures are the supporting indicators; below are the test stages and three playbooks for what teams most often get wrong.

DORA’s ordering: “faster-running unit tests run before slower-running acceptance tests, and both are run before any manual testing”, with developer feedback in under ten minutes.[42] Budgets after the first row are this Atlas’s suggestions.

Stage What runs (budget) A failure blocks
1. Push and pull request Unit tests, static analysis, fast component tests (under about 10 minutes[42]) The merge
2. Trunk build Fast suite plus integration, security and policy checks on the artifact built once (under about 30 minutes) Publishing the artifact
3. Staging Acceptance tests “against automatically deployed running software”;[42] performance tests where needed (under about an hour) Promotion to production
4. Production Version-aware smoke test; canary analysis where used (minutes) The rollout, triggering rollback
5. Manual and exploratory Human testing of new behaviour, outside the deployment path Only high-risk tiers

DORA’s advice is “don’t tolerate flaky tests”: a pass should mean the software is releasable and a failure a real defect;[42] flaky tests also teach people to rerun until green. Quarantine mechanics belong to TestOps.

Playbook 1: introducing trunk-based development to a team on long-lived branches

Link to section “Playbook 1: introducing trunk-based development to a team on long-lived branches”

Prerequisites: CI runs on every push; a feature-toggle mechanism exists (even a config switch); the team agrees.

  1. Measure the baseline for two weeks: active branches, median branch age, merge conflicts, review wait.
  2. Make CI fast (about 10 minutes or less) first;[36] on a slow pipeline, trunk-based development queues at the merge button.
  3. Agree: branches live less than a day, reviews are answered within an agreed window, incomplete work hides behind toggles.
  4. Drain the old branches one at a time, behind a toggle.
  5. Protect trunk: review and a green build to merge; no force-pushes.
  6. Review after four weeks with the same measures.

Example status: syntax-checked by bash -n, not executed against a remote repository. gh is the GitHub CLI; on other platforms, open the pull request in the web interface.

# A day in trunk-based development: one small change, merged the same day.
git switch main && git pull --ff-only
git switch -c fix/checkout-rounding        # short-lived branch, hours not weeks
# ...edit code and tests...
git add -A && git commit -m "Round totals half-even in checkout (flagged off)"
git fetch origin && git rebase origin/main  # stay current with trunk
git push -u origin fix/checkout-rounding    # pushes the branch; the reference workflow runs only on a PR
gh pr create --fill                         # open the pull request; CI runs on it
# after a green build and a prompt review, merge via the platform, then:
git switch main && git pull --ff-only && git branch -d fix/checkout-rounding

Acceptance criteria: three or fewer active branches; median branch age under a day; no code freeze in the period. Rollback: if trunk is repeatedly broken, pause and invest in tests rather than returning to long branches. Variants: pair or ensemble programming can replace asynchronous review; DORA recommends making review synchronous.[12]

Count every manual step of today’s deployment, including undocumented ones;[33] script them in version control; use the same script and artifact for every environment, with configuration kept separate;[33] add a smoke test that fails the deployment and a rehearsed rollback; emit a deployment record; then move deployment into the pipeline (the reference implementation shows the end state). Acceptance criteria: zero manual steps for standard changes, rollback rehearsed this quarter, every deployment recorded, so that “releases are performed in a low-risk way during normal business hours”.[15]

Playbook 3: a schema change that keeps rollback safe

Link to section “Playbook 3: a schema change that keeps rollback safe”

DORA recommends versioned database change scripts, decoupled from application changes so the application can roll back “without requiring a database rollback”.[41] The technique is parallel change, or expand and contract: expand to support old and new, migrate the clients, then contract.[44] Illustrative example: renaming orders.cust_name to orders.customer_name takes five small deployments, each passing the pipeline on its own: (1) add a nullable customer_name; (2) write both columns, still reading cust_name; (3) copy old values with an idempotent batch job checked by row counts; (4) read customer_name, still writing both; (5) stop writing cust_name and drop it after a soak period. Steps 1–4 can each be undone by redeploying the previous application version, because the old column stays complete; step 5 is irreversible, so back up and schedule it deliberately. The common failure is steps 1 and 5 in one migration (a plain rename). Migration tooling, locks and replication lag belong to DBOps.

DevOps has no normative standard of the ISO kind; none of these sources is mandatory unless a regulator or contract makes it so.

Source (type) What it gives you How binding
DORA metrics guide and capability catalogue[1][17] (survey research) The five metrics, capabilities that predict performance, the Quick Check[45] Recommendation; “the longest running academically rigorous research investigation of its kind”, in DORA’s words[7]
Accelerate[5]; The DevOps Handbook;[9] Fowler and Humble on CI and CD[22][30][35] The research model; principles and engineering practices Recommendation
CAMS / CALMS[16][18] A diagnostic checklist Heuristic
Team Topologies[37]; DevOps Topologies[13] Team types, interaction modes, anti-types Heuristic
NIST SP 800-218 SSDF: v1.1 final (2022);[46] v1.2 (Rev. 1) in draft as of October 2026[47] Secure development practices for any SDLC (DevSecOps) Voluntary unless contract or regulation requires it
CDEvents (CD Foundation)[48] A CI/CD event vocabulary extending CloudEvents Optional

Named tools are examples verified to exist and to describe themselves as stated (October 2026), not endorsements; features and pricing change.

Tool category Representative verified options Selection criteria Risks
Version control and review Git platforms (GitHub, GitLab and others) Protection rules, audit logs, API Lock-in through proprietary features
CI/CD orchestration GitHub Actions;[49] GitLab CI/CD (.gitlab-ci.yml, runners);[50] Jenkins (“The leading open source automation server”, 2,300+ plugins);[51] Tekton (“Kubernetes Native CI/CD”, CNCF incubating)[52] Where code lives; hosted or self-hosted; secrets; approvals; templates; runner isolation Plugin sprawl; unowned pipeline code; long-lived credentials
Feature management OpenFeature, a “vendor-agnostic, community-driven API for feature flagging” (CNCF incubating),[53] over a flag provider SDKs, audit, flag lifecycle Toggle debt; hidden configuration
Delivery metrics Source-available and commercial tools; DORA suggests starting with conversations or the Quick Check[1] Per-service granularity; inspectable definitions Measuring instead of improving[1]

Pull-based deployment, infrastructure as code and observability tooling are covered on GitOps, InfraOps and ObservabilityOps.

Comparison matrix: CI/CD orchestrators (evidenced criteria only, as of October 2026)

Link to section “Comparison matrix: CI/CD orchestrators (evidenced criteria only, as of October 2026)”
Criterion GitHub Actions GitLab CI/CD Jenkins Tekton
Configuration as code in the repository Yes: workflow YAML[49] Yes: .gitlab-ci.yml[50] Yes: a Jenkinsfile “checked into source control”[54] Pipelines defined as Kubernetes-native resources (implied by “Kubernetes Native CI/CD”)[52]
Runs on GitHub-hosted, larger or self-hosted runners[49] Runners (“the agents that run your jobs”)[50] Infrastructure you operate (typical) Kubernetes (“Kubernetes Native CI/CD”)[52]
Deployment approvals built in Environments with required reviewers (up to 6), prevent self-review, wait timers, branch restrictions[55] Deployment approvals for protected environments[56] No environment-level approval feature verified. The Pipeline input step “pauses Pipeline execution” until someone proceeds or aborts, and its submitter parameter limits who may respond to named users or groups (Jenkins administrators always can)[57] Not verified for this page
Licence and plan caveat Free, Pro, Team: required reviewers and wait timers in public repositories only; Enterprise lists protection rules for private ones[55][58] Deployment approvals need the Premium or Ultimate tier[56] Open source;[51] you pay for the infrastructure Open source;[52] you pay for the cluster

Selection heuristics: prefer the CI system native to where your code lives unless isolation or regulation forces self-hosting; confirm you can export pipeline definitions and deployment history; prove it on your two hardest pipelines.

Automate what is repetitive, rule-based and frequent: builds, tests, deployments, environments, dependency updates, evidence and metrics. Keep humans on novel, high-impact judgement: architecture, risky migrations, incident command, choosing the next constraint; in Humble’s words, “computers perform repetitive tasks, people solve problems”.[35] Automating a bad process makes waste faster, unowned automation becomes the new bottleneck, and a failing auto-remediation loop can hide a real incident.

What the evidence says about AI (as of October 2026). DORA’s 2024 report found that AI adoption “significantly increases individual productivity, flow, and job satisfaction”, yet “negatively impacts software delivery stability and throughput”.[59] Its 2025 research calls AI an amplifier of existing strengths and weaknesses.[28] DORA’s AI Capabilities Model (78 in-depth interviews, a survey of almost 5,000 respondents) names seven capabilities that “amplify or unlock the benefits of AI”: a clear and communicated AI stance; healthy data ecosystems; AI-accessible internal data; strong version control practices; working in small batches; a user-centric focus; quality internal platforms. Without a user-centric focus, “AI adoption can have a negative impact on team performance”.[60] Reviewing machine-generated code can take more effort per line, so small batches matter more.[43]

Each AI use needs its own control: generated tests and pipeline code are reviewed and run in CI (risk: tests that pass trivially); build and incident summaries are checked against raw logs; auto-remediation gets a narrow scope, a kill switch and an audit log (risk: loops that mask incidents).

Scenario (illustrative). One team owns checkout-api, a containerised Python service on GitHub, and wants every pull request tested, every merge to main built once, and the same image deployed to staging then production, with a smoke test, automatic rollback and a machine-generated deployment record. It uses GitHub Actions (any orchestrator works) and GitHub’s container registry; scripts/deploy.sh is yours to write for your runtime. Environments staging and production exist in the repository settings;[61] for a human approval, add required reviewers to production (up to six, with an option to prevent self-review).[55] Placeholders such as example.com are fake.

Example status: YAML syntax-checked by the Atlas validator; keys checked against GitHub’s workflow syntax, expressions and OIDC documentation on 2026-10-16;[49][62][63] not executed (it needs a repository, a registry, a cloud role and a deploy target). Action major versions match the actions’ READMEs as of October 2026;[64][65] pin them to full commit SHAs in production.

# .github/workflows/delivery.yml
# Test every pull request; on main: build once, deploy the SAME image to staging, then production.
name: delivery

on:
  pull_request:
    branches: [main]
  push:
    branches: [main]

permissions:
  contents: read            # least privilege by default; jobs widen only what they need

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  # Cancel superseded pull-request runs, but never cancel a deployment already running on main.
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

env:
  IMAGE: ghcr.io/example-org/checkout-api   # registry paths must be lowercase

jobs:
  test:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v7
      - uses: actions/setup-python@v7
        with:
          python-version: '3.13'
      - run: python -m pip install -r requirements.txt -r requirements-dev.txt
      - run: python -m pytest -q

  build:
    if: github.event_name == 'push'
    needs: test
    runs-on: ubuntu-latest
    timeout-minutes: 20
    permissions:
      contents: read
      packages: write       # push to the registry and nothing else
    outputs:
      image: ${{ steps.meta.outputs.image }}
    steps:
      - uses: actions/checkout@v7
      - id: meta
        run: echo "image=${IMAGE}:${GITHUB_SHA}" >> "$GITHUB_OUTPUT"
      - name: Build once, tag by commit SHA, push
        env:
          REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          REGISTRY_USER: ${{ github.actor }}
          IMAGE_REF: ${{ steps.meta.outputs.image }}
        run: |
          echo "$REGISTRY_TOKEN" | docker login ghcr.io -u "$REGISTRY_USER" --password-stdin
          docker build --label "org.opencontainers.image.revision=${GITHUB_SHA}" -t "$IMAGE_REF" .
          docker push "$IMAGE_REF"

  deploy-staging:
    needs: build
    runs-on: ubuntu-latest
    timeout-minutes: 20
    permissions:
      contents: read        # job-level permissions replace the default, so restate it
      id-token: write       # may request a short-lived OIDC token; grants no other access
    environment:
      name: staging
      url: https://staging.checkout.example.com
    steps:
      - uses: actions/checkout@v7
      # Log in to your cloud here with its official OIDC login action. The cloud role trusts only the
      # subject repo:example-org/checkout-api:environment:staging. No long-lived cloud keys in secrets.
      - name: Deploy the image built above
        env:
          IMAGE_REF: ${{ needs.build.outputs.image }}
        run: ./scripts/deploy.sh staging "$IMAGE_REF"
      - name: Smoke test
        run: ./scripts/smoke-test.sh https://staging.checkout.example.com "$GITHUB_SHA"

  deploy-production:
    needs: [build, deploy-staging]
    runs-on: ubuntu-latest
    timeout-minutes: 30
    permissions:
      contents: read
      id-token: write
    environment:
      name: production      # protection rules (reviewers, allowed branches) are set on the environment
      url: https://checkout.example.com
    steps:
      - uses: actions/checkout@v7
      # OIDC cloud login here; this role trusts only repo:example-org/checkout-api:environment:production.
      - id: start
        run: echo "at=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT"
      - name: Deploy the same image
        env:
          IMAGE_REF: ${{ needs.build.outputs.image }}
        run: ./scripts/deploy.sh production "$IMAGE_REF"
      - name: Smoke test
        run: ./scripts/smoke-test.sh https://checkout.example.com "$GITHUB_SHA"
      - name: Roll back to the previous image
        if: ${{ failure() }}
        run: ./scripts/rollback.sh production
      - name: Record the deployment event
        if: ${{ !cancelled() }}
        env:
          OUTCOME: ${{ job.status }}
          STARTED_AT: ${{ steps.start.outputs.at }}
          EVENTS_URL: ${{ secrets.DELIVERY_EVENTS_URL }}
          RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
        run: |
          printf '{"service":"checkout-api","environment":"production","version":"%s","started_at":"%s","finished_at":"%s","outcome":"%s","run_url":"%s"}\n' \
            "$GITHUB_SHA" "$STARTED_AT" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$OUTCOME" "$RUN_URL" > deployment-event.json
          curl --fail --silent --show-error -X POST -H 'Content-Type: application/json' \
            --data @deployment-event.json "$EVENTS_URL"

Why it is built this way:

  • Build once, deploy many. Only build creates an image; both deploy jobs use the same commit-SHA tag.[33]
  • Least privilege, including the deployment credential. Default contents: read; only build writes packages; only the deploy jobs may request an OIDC token, which the cloud exchanges for “a short-lived access token that is only valid for a single job”, so “you won’t need to duplicate your cloud credentials as long-lived GitHub secrets”.[66] For jobs that reference an environment, the token’s subject is repo:ORG-NAME/REPO-NAME:environment:ENVIRONMENT-NAME:[63] make each cloud role trust only its own repository and environment. That alone does not stop a feature branch: environments allow every branch to deploy unless you set deployment branches, and by default administrators can bypass protection rules,[55] so limit production to main and disallow bypassing before the production role trusts that subject. Fallback if the target cannot use OIDC: environment secrets, readable only by jobs that reference the environment[55] (Pro, Team or Enterprise for private repositories), kept narrow and rotated. Secrets reach scripts through env, never ${{ }} in shell text, which prevents script injection.
  • Never cancel a deployment midway. cancel-in-progress is true only for pull requests; a concurrency group keeps one pending run and cancels an older pending one,[49] so on main the latest change wins.
  • Failure is handled in the pipeline. A failed smoke test triggers rollback (failure()[62]), and the deployment is recorded whatever the outcome, so the change fail rate cannot be hidden.

Example status: executed on 2026-10-16 (GNU bash, curl) against a local HTTP server, covering three cases: correct version (exit 0), wrong version (exit 1) and connection refused (exit 1).

#!/usr/bin/env bash
# smoke-test.sh: fail a deployment unless /healthz answers with the expected version in time.
# Usage: smoke-test.sh <base-url> [expected-version]
set -euo pipefail

BASE_URL="${1:?usage: smoke-test.sh <base-url> [expected-version]}"
EXPECTED_VERSION="${2:-}"
ATTEMPTS="${ATTEMPTS:-10}"
SLEEP_SECONDS="${SLEEP_SECONDS:-3}"

for attempt in $(seq 1 "$ATTEMPTS"); do
  if body="$(curl --silent --show-error --fail --max-time 5 "${BASE_URL}/healthz")"; then
    if [[ -z "$EXPECTED_VERSION" || "$body" == *"\"version\": \"${EXPECTED_VERSION}\""* ]]; then
      echo "smoke test passed on attempt ${attempt}: ${body}"
      exit 0
    fi
    echo "attempt ${attempt}: healthy but running the wrong version: ${body}" >&2
  else
    echo "attempt ${attempt}: health check failed" >&2
  fi
  sleep "$SLEEP_SECONDS"
done

echo "smoke test FAILED after ${ATTEMPTS} attempts against ${BASE_URL}" >&2
exit 1

Checking the version, not just HTTP 200, catches the silent failure where the old version still serves because the new one never started. /healthz must report its build version, for example {"status": "ok", "version": "<commit-sha>"}; the string match assumes that spacing, so parse JSON (for example with jq) in real services.

The pipeline posts a minimal event; your metrics store adds the commits (git log <previous-version>..<version>) and links incidents, as in the richer record below. The schema is this Atlas’s own, not claimed to conform to CDEvents, which is worth evaluating if several tools must exchange delivery events.[48]

Example status: JSON syntax-checked by the validator. The SHA is a fake full-length value, because the pipeline records the full 40-character $GITHUB_SHA.

{
  "service": "checkout-api",
  "environment": "production",
  "version": "3f9c2e1d4b7a8c6e5f0a1b2c3d4e5f6a7b8c9d0e",
  "started_at": "2026-09-08T15:52:10Z",
  "finished_at": "2026-09-08T16:00:00Z",
  "outcome": "success",
  "commits": [
    {"sha": "3f9c2e1d4b7a8c6e5f0a1b2c3d4e5f6a7b8c9d0e", "committed_at": "2026-09-08T10:00:00Z"}
  ],
  "failed": true,
  "failure": {
    "detected_at": "2026-09-08T16:07:00Z",
    "recovered_at": "2026-09-08T19:10:00Z",
    "incident_id": "INC-0420",
    "recovery": "fix-forward"
  },
  "unplanned": false,
  "run_url": "https://ci.example.com/runs/12345"
}

outcome: success and failed: true are both correct: the pipeline succeeded, but the deployment later needed immediate intervention. Change fail rate counts the second; counting only red pipelines under-reports it.

Three labs, from beginner to advanced. Labs 1 and 2 need no cloud account and cost nothing; Lab 3 uses a public GitHub repository.

Lab 1 (beginner): map a value stream and find the constraint

Link to section “Lab 1 (beginner): map a value stream and find the constraint”
  • Objective: find where a change spends its time, and why, with DORA’s value stream mapping method.[29]
  • Prerequisites: a whiteboard or spreadsheet; 60–90 minutes; people from every part of one service’s stream (business, design, development, testing, operations, support). Cost and risk: none, except politics: present findings as system problems.

Steps

  1. Choose one service and one typical change type, for example “a small feature”.
  2. List the steps from “work item accepted” to “running in production”, keeping to 5–15 process blocks.
  3. For each block, record process time (hands-on work), lead time (elapsed, including waiting) and %C/A from recent real examples; %C/A is recorded by the receiving step: the share of the work it receives that it can use without sending it back.[29] Use one unit for lead times (here, working days of 8 hours).
  4. Compute the totals: lead time = Σ lead times; process time = Σ process times; activity ratio = process time ÷ lead time; rolled %C/A = the product of all the %C/A values.
  5. Circle the block with the largest waiting time (lead minus process) and the block with the lowest %C/A, then draw a future-state map for 6 months to 2 years ahead.[29]

Worked example (illustrative data)

Step Process time Lead time (working days) %C/A of the work this step receives
Refine work item 2 h 3 80%
Code and unit test 6 h 1 90%
Code review 0.5 h 2 85%
Manual QA in shared test environment 3 h 4 70%
Change advisory board (CAB) 0.25 h 5 95%
Deployment (manual, fixed release window) 2 h 3 90%
Total 13.75 h 18 rolled ≈ 37%

At 8 hours per working day, 18 days are 144 hours, so the activity ratio is 13.75 ÷ 144 ≈ 9.5%: more than 90% of the elapsed time is waiting (in 24-hour days it would be 3.2%, so keep one unit from map to map). Rolled %C/A = 0.80 × 0.90 × 0.85 × 0.70 × 0.95 × 0.90 ≈ 0.366: only about one change in three passes every step without rework.

  • Expected output: a map, totals and one or two named constraints: here the CAB wait (5 days for 15 minutes of work) and QA (4 days, with 30% of incoming changes needing rework, so the fix lies upstream in CI tests and review).
  • Validation: participants agree the numbers within about 20%; otherwise pull data from tickets and version control. Troubleshooting: an unknown lead time is itself a finding (add timestamps); more than 15 blocks means you are mapping tasks.
  • Teardown: photograph and date the map; repeat in about six months.[29]

Lab 2 (intermediate): compute the five DORA metrics from a deployment log

Link to section “Lab 2 (intermediate): compute the five DORA metrics from a deployment log”
  • Objective: turn raw deployment records into DORA’s five metrics and understand what each number does not tell you.[1]
  • Prerequisites: Python 3.8 or later, standard library only; 30 minutes; no cost or risk (illustrative data).

Steps

  1. Save the illustrative two-week log below as deployments.json. It covers one service, which is the level at which DORA says the metrics belong.[1]

Example status: JSON syntax-checked; this exact file was used for the executed run below.

{
  "service": "checkout-api",
  "window": {"start": "2026-09-01T00:00:00Z", "end": "2026-09-15T00:00:00Z"},
  "deployments": [
    {"id": "d01", "deployed_at": "2026-09-01T10:00:00Z", "commits": ["2026-08-31T15:00:00Z", "2026-09-01T08:30:00Z"], "failed": false, "unplanned": false},
    {"id": "d02", "deployed_at": "2026-09-02T11:00:00Z", "commits": ["2026-09-01T16:00:00Z"], "failed": true, "recovered_at": "2026-09-02T11:45:00Z", "unplanned": false},
    {"id": "d03", "deployed_at": "2026-09-02T14:00:00Z", "commits": ["2026-09-02T12:30:00Z"], "failed": false, "unplanned": true},
    {"id": "d04", "deployed_at": "2026-09-04T09:30:00Z", "commits": ["2026-09-03T17:00:00Z", "2026-09-04T08:00:00Z"], "failed": false, "unplanned": false},
    {"id": "d05", "deployed_at": "2026-09-07T10:15:00Z", "commits": ["2026-09-04T15:00:00Z", "2026-09-07T09:00:00Z"], "failed": false, "unplanned": false},
    {"id": "d06", "deployed_at": "2026-09-08T16:00:00Z", "commits": ["2026-09-08T10:00:00Z"], "failed": true, "recovered_at": "2026-09-08T19:10:00Z", "unplanned": false},
    {"id": "d07", "deployed_at": "2026-09-08T19:00:00Z", "commits": ["2026-09-08T18:20:00Z"], "failed": false, "unplanned": true},
    {"id": "d08", "deployed_at": "2026-09-10T11:00:00Z", "commits": ["2026-09-09T14:00:00Z", "2026-09-10T09:45:00Z"], "failed": false, "unplanned": false},
    {"id": "d09", "deployed_at": "2026-09-11T15:30:00Z", "commits": ["2026-09-11T10:00:00Z"], "failed": false, "unplanned": false},
    {"id": "d10", "deployed_at": "2026-09-14T10:00:00Z", "commits": ["2026-09-11T16:00:00Z", "2026-09-14T08:30:00Z"], "failed": false, "unplanned": false}
  ]
}
  1. Save the script as dora_metrics.py.

Example status: executed on 2026-10-16 with Python 3.8.10; syntax-checked by the validator.

"""Compute DORA's five software delivery metrics for ONE service from a deployment log.

Usage: python3 dora_metrics.py deployments.json
Definitions follow dora.dev/guides/dora-metrics (updated 2026-01-05). Standard library only.
"""
import json
import statistics
import sys
from datetime import datetime


def ts(value):
    """Parse an ISO-8601 UTC timestamp such as 2026-09-01T10:00:00Z."""
    return datetime.fromisoformat(value.replace("Z", "+00:00"))


def hours(delta):
    return delta.total_seconds() / 3600


def main(path):
    with open(path, encoding="utf-8") as fh:
        data = json.load(fh)
    deps = sorted(data["deployments"], key=lambda d: d["deployed_at"])
    if not deps:
        sys.exit("no deployments in window")
    start, end = ts(data["window"]["start"]), ts(data["window"]["end"])
    days = (end - start).total_seconds() / 86400

    # Throughput 1: deployment frequency (and the gap between deployments).
    per_day = len(deps) / days
    gaps = [hours(ts(b["deployed_at"]) - ts(a["deployed_at"])) for a, b in zip(deps, deps[1:])]

    # Throughput 2: change lead time = commit -> running in production, per change.
    lead = [hours(ts(d["deployed_at"]) - ts(c)) for d in deps for c in d["commits"]]

    # Instability 1: change fail rate = deployments needing immediate intervention / deployments.
    failed = [d for d in deps if d["failed"]]
    # Throughput 3: failed deployment recovery time, change-caused failures only.
    # The clock starts at deployed_at (this Atlas's convention; starting at detection is the alternative).
    recovery = [hours(ts(d["recovered_at"]) - ts(d["deployed_at"])) for d in failed]
    # Instability 2: deployment rework rate = unplanned deployments caused by a production incident / deployments.
    rework = [d for d in deps if d["unplanned"]]

    print(f"service: {data['service']}  window: {days:.0f} days  deployments: {len(deps)}")
    print(f"deployment frequency: {per_day:.2f}/day ({per_day * 7:.1f}/week); median gap {statistics.median(gaps):.1f} h")
    print(f"change lead time: median {statistics.median(lead):.1f} h; p90 {statistics.quantiles(lead, n=10)[-1]:.1f} h; n={len(lead)} changes")
    print(f"change fail rate: {len(failed)}/{len(deps)} = {len(failed) / len(deps):.0%}")
    if recovery:
        print(f"failed deployment recovery time: median {statistics.median(recovery) * 60:.0f} min (n={len(recovery)})")
    print(f"deployment rework rate: {len(rework)}/{len(deps)} = {len(rework) / len(deps):.0%}")


if __name__ == "__main__":
    main(sys.argv[1] if len(sys.argv) > 1 else "deployments.json")
  1. Run python3 dora_metrics.py deployments.json.

Expected output (copied from the real run):

service: checkout-api  window: 14 days  deployments: 10
deployment frequency: 0.71/day (5.0/week); median gap 29.8 h
change lead time: median 5.5 h; p90 66.5 h; n=15 changes
change fail rate: 2/10 = 20%
failed deployment recovery time: median 118 min (n=2)
deployment rework rate: 2/10 = 20%

Validation: check one number by hand. The lead times sorted are 0.7, 1.25, 1.25, 1.5, 1.5, 1.5, 1.5, 5.5, 6, 16.5, 19, 19, 21, 66 and 67.25 hours; the eighth of 15 values is 5.5 hours, matching the median. Then compare your interpretation with reading the numbers.

Exercises. (a) Mark d06 as "failed": false and rerun: what changes, and what should a reviewer ask before accepting that edit? (b) Move d05 and d10 to Friday evening: lead time falls, but is a Friday-evening deployment a good idea? Troubleshooting: ValueError: Invalid isoformat string means a malformed timestamp; statistics.StatisticsError means an empty list (you need at least two deployments and two changes). Teardown: delete the two files.

Lab 3 (advanced): a pipeline with a smoke test, rollback and a deployment record

Link to section “Lab 3 (advanced): a pipeline with a smoke test, rollback and a deployment record”
  • Objective: build the reference implementation and prove that a bad deployment is caught and recorded.
  • Prerequisites: a public GitHub repository (on Free, Pro and Team, required reviewers work only in public repositories, as of October 2026);[55] Docker; any deploy target that your deploy.sh and rollback.sh drive (a free-tier VM, a local Kubernetes cluster). Cost and risk: possibly small cloud costs; use a throwaway project, never a real production system.
  • Status: not executed for this page (it needs your account and target); the smoke test was executed locally.

Steps

  1. Create a minimal service whose /healthz returns {"status": "ok", "version": "<full-commit-sha>"}, with the 40-character SHA injected at build time.
  2. Add delivery.yml, scripts/smoke-test.sh, deploy.sh and rollback.sh (which redeploys the last successful image tag). For a cloud target, create one role per environment trusting GitHub’s OIDC provider for repo:<you>/<repo>:environment:staging or …:production only; no long-lived cloud keys in repository secrets.[66]
  3. Create the staging and production environments, with yourself as a required reviewer on production.
  4. Merge a harmless change: test → build → staging → production, all green, one event delivered.
  5. Failure drill: make /healthz report a wrong version and merge.
  • Expected output: in step 5 the production smoke test fails after its retries, rollback runs, the job is red, the previous version still serves, and the event records "outcome": "failure".
  • Validation: mapped to Lab 2’s format (outcome: failure → "failed": true), the Lab 2 script counts one failed deployment. Troubleshooting: docker push denied → check packages: write and a lowercase image name; job waiting forever → a required reviewer has not approved; event post failing → check the DELIVERY_EVENTS_URL secret (curl --fail turns HTTP errors into a failed step).
  • Teardown: delete the environments, secrets, images and cloud roles with their OIDC trust, destroy the target, and archive the repository.

Case A is sourced history; B and C are illustrative composites. The regulated change-approval case is the judgement call.

A. Flickr, 2009 (sourced). At the Velocity conference, John Allspaw and Paul Hammond spoke on “10+ Deploys A Day: Devs & Ops Cooperation at Flickr”. The contemporary report quotes the session summary: “on a normal day there are 10 full deployments of the site to our servers”.[24] It was an early public demonstration that frequent deployment is possible when the two groups share goals and tooling; the report gives no failure or recovery figures, so it is not a benchmark.

Metrics and KPIs: the delivery measurement model

Link to section “Metrics and KPIs: the delivery measurement model”

This page owns the delivery measurement model for the Atlas; other pages link here rather than redefining these metrics.

DORA (metrics guide updated 2026-01-05) groups its five metrics into throughput (how many changes move through the system) and instability (how well deployments go), and applies them “at the application or service level”.[1]

Metric Group DORA definition[1] Operational formula (per service, per period)
Change lead time Throughput “The amount of time it takes for a change to go from committed to version control to deployed in production.” Median over changes of (deployed_at − committed_at); also report p90
Deployment frequency Throughput “The number of deployments over a given period or the time between deployments.” Deployments ÷ days, or the median gap between deployments
Failed deployment recovery time Throughput “The time it takes to recover from a deployment that fails and requires immediate intervention.” Median over failed deployments of (recovered_at − deployed_at); the start point is this Atlas’s convention (see the notes)
Change fail rate Instability “The ratio of deployments that require immediate intervention following a deployment.” Failed deployments ÷ deployments
Deployment rework rate Instability “The ratio of deployments that are unplanned but happen as a result of an incident in production.” Unplanned (incident-driven) deployments ÷ deployments

Data comes from deployment records, version control (commit times) and incident records linked to deployments. Four notes:

  • Recovery time covers only change-caused failures. Before 2023 it was “time to restore service” for any outage; the 2024 model moved it into throughput.[27] Generic incident MTTR is taught in IncidentOps.
  • “Lead time” is ambiguous. DORA’s change lead time starts at commit; Kanban lead time starts at the request (AgileOps). Say which one you mean.
  • Rework rate is the newest metric (2024). DORA added it to test whether change fail rate was a good proxy for the rework a team must do.[27]
  • DORA does not fix when the recovery clock starts. This page starts it at deployment, which counts the time a failure went unnoticed; starting at detection isolates response speed. Choose one, write it down, and keep it stable.
Figure 7. The measurement model: capabilities drive delivery performance, which drives outcomes
OutcomesDelivery performance, per serviceCapabilities you can changemonthly reviewTechnical: CI,trunk-based, test anddeploy automation, loosecouplingProcess: small batches,streamlined approval,value stream visibilityCultural: generativeculture, transformationalleadershipThroughput: lead time,deployment frequency,recovery timeInstability: change failrate, rework rateOrganisationalperformanceWell-being: less burnout,less deployment pain
Diagram source (Mermaid)
---
config:
  flowchart:
    nodeSpacing: 30
    wrappingWidth: 170
---
flowchart TB
  subgraph CAP["Capabilities you can change"]
    C1["Technical: CI, trunk-based, test and deploy automation, loose coupling"]
    C2["Process: small batches, streamlined approval, value stream visibility"]
    C3["Cultural: generative culture, transformational leadership"]
  end
  subgraph PERF["Delivery performance, per service"]
    T["Throughput: lead time, deployment frequency, recovery time"]
    I["Instability: change fail rate, rework rate"]
  end
  subgraph OUT["Outcomes"]
    O1["Organisational performance"]
    O2["Well-being: less burnout, less deployment pain"]
  end
  C1 --> T
  C2 --> T
  C3 --> T
  C1 --> I
  C2 --> I
  C3 --> I
  T --> O1
  I --> O1
  T --> O2
  I --> O2
  O1 -.->|"monthly review"| C1
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class C1,C2,C3 neutral
  class T,I core
  class O1,O2 decision

Text equivalent: Three layers. Technical capabilities (CI, trunk-based development, test and deployment automation, loose coupling), process capabilities (small batches, streamlined approval, value stream visibility) and cultural capabilities (generative culture, transformational leadership) each drive throughput (lead time, deployment frequency, recovery time) and instability (change fail rate, rework rate), which drive organisational performance and well-being; a dashed “monthly review” arrow returns to the capabilities. DORA calls the metrics leading indicators of performance and well-being, and lagging indicators of the practices.[1]

The Lab 2 output (one service, 14 days, 10 deployments, 15 changes): 0.71 deployments a day; median lead time 5.5 hours, p90 66.5 hours; change fail rate 20% (d02, d06); recovery time 117.5 minutes (shown as 118), the median of 45 (d02, rolled back) and 190 (d06, fixed forward); rework rate 20% (d03 and d07, the unplanned follow-ups).

  • Throughput is healthy for a team deploying in working hours. The p90 lead time comes from two commits made on a Friday afternoon and deployed on Monday morning (d05, d10): the weekend is the constraint, not the pipeline, so ask whether that matters before “fixing” it.
  • Instability needs attention. One deployment in five fails, and both failures were followed by an unplanned deployment. Rework rate exposes this fix-forward work, which a team that tracks only rollbacks would miss.[27]
  • Small samples are noisy. With 10 deployments, one more failure moves the change fail rate by 10 points; watch trends over months.
  • Experiments. Adopt “roll back first, fix forward afterwards”, because d06’s fix forward took four times longer than d02’s rollback, and look at what d02 and d06 had in common (size, test coverage, area of code); see the worked runbook.

These are not DORA’s five. Most come from DORA’s capability guides, as ways to measure the capabilities behind the five.

Indicator Formula or definition Pitfall Cadence
CI feedback time Push → result, p50 and p90 Averaging hides a slow tail Weekly
Broken-build resolution time Red trunk → green (fix or revert)[36] Teams disable tests to “fix” it Weekly
Review wait time PR opened → first review; watch outliers[12] Pressure for rubber-stamp reviews Weekly
Approval wait time; automated-promotion share Time waiting for approvers; share of changes reaching production without manual approval[11] Reclassifying risky changes as “standard” Monthly
Manual deployment steps Count of manual steps per deployment[33] Hidden steps nobody writes down Quarterly
Flaky-test rate Tests that both pass and fail on the same code Retrying until green Weekly
Non-actionable alert share Alerts needing no action ÷ all alerts[38] Silencing instead of fixing Monthly
Westrum culture score Mean of six statements on a 1–7 scale[14] Using it to judge individual managers Quarterly

Start from your own baseline. The metrics guide gives no numeric thresholds, only that top performers do well across all five and low performers do poorly.[1] Relying on one metric is a listed pitfall: “Teams should identify multiple metrics, including some with a healthy amount of tension between them”.[1] Set direction, not quotas (lead time down with change fail rate flat, not “deploy 10 times a day”). For an industry comparison, the Quick Check (five multiple-choice questions, under a minute) compares you “to the rest of the industry”.[45]

“Elite” is a survey cluster, not a standard. The language comes from DORA’s annual reports, not the metrics guide. In 2021 DORA “used four metrics to classify teams as elite, high, medium or low performers”, and high and elite made up two-thirds of respondents.[67] Clusters are recomputed yearly: results “tend to cluster into four groups”, yet the 2022 data had no “Elite” cluster.[68] The 2025 report adds “a cluster analysis that reveals seven common team profiles or archetypes” combining performance, stability and well-being, including “Foundational challenges” and “Harmonious high achievers”;[69] the full report was not opened, so this page does not name the other five, say whether they replace the clusters, or give thresholds. If a tool calls your team “elite”, ask which year, service and window.

Trap Why it misleads Use instead
Organisation-wide blended deployment count Mixes dissimilar services[1] Per-service trends
Team leaderboards Competing is a listed pitfall;[1] invites gaming Each team against its own past
Number of pipelines or “teams doing DevOps” Activity, not outcomes Five metrics plus a user outcome
Pipeline success rate as change fail rate Green pipelines can ship broken deployments Deployments needing intervention
Test coverage as a goal Coverage rises while assertions weaken Escaped-defect trend
Lines of code, or AI-generated volume More code is not more value Lead time and outcomes

Data collection traps. Write down what “requires immediate intervention” means and apply it consistently. Some change failures surface late (leaks, batch jobs, cache expiry): link each change-caused incident to its deployment and mark it failed whenever it was detected, or the change fail rate is undercounted. Squash merges hide commit times, so decide whether lead time starts at the first commit or when the pull request opens. For apps and packaged software, measure the release you control. Below about 20 deployments a period, percentages swing widely; use rolling 90-day windows.

DevOps moves controls into the pipeline, where they run on every change and leave evidence. Security engineering belongs to DevSecOps, audit evidence programmes to ComplianceOps and change governance to ITOps; segregation of duties is under risk controls.

Risk (likelihood / impact) Signal Mitigation Owner
Pipeline compromise (medium / severe) Unexpected workflow edits; runners with broad cloud rights Least privilege; ephemeral runners; reviewed pipeline files; short-lived (OIDC) credentials[66] Platform
Unreviewed change in production (medium / high) Admin merges; direct pushes Branch protection; alerts on bypass Team, platform
Evidence gap at audit (medium / high) Missing links between commit, review, build and deployment Machine-generated records kept per retention policy Platform, compliance
Personal data in test environments (medium / high) Production dumps in staging Synthetic or masked data; test data management is a DORA capability[17] Team, data protection officer
Vulnerable dependencies (high / variable) Growing scanner backlog Automated updates and scanning (DevSecOps; NIST SSDF[46]) Team, AppSec
Rollback impossible after a schema change (medium / high) Drop or rename in one step Expand and contract (Playbook 3 in core practices); rehearsed rollback Team

Jurisdiction caveat. No legal advice here. EU financial entities must also comply with the Digital Operational Resilience Act (see what DevOps is not); map your obligations to automated controls with your compliance function.

Cost driver Grows with Lever
CI/CD compute Commits × pipeline duration × parallelism Caching, test selection, right-sized runners
Environments Number and lifetime of staging and preview environments Ephemeral environments with teardown
Artifact and log storage Builds × retention Retention policies; delete untagged images
Observability data Volume × retention × cardinality Sampling, retention tiers (ObservabilityOps)
Licences and people Seats; platform and enabling teams Consolidate; run the platform as a product (PlatformOps)

Cloud unit economics belong to FinOps and the carbon side to GreenOps.

Cost of delay (illustrative). Cost of delay ≈ value per week in production × weeks of waiting. Twelve features a quarter, each worth an estimated 5,000 currency units a week once live and each waiting 3 weeks after “code complete”, leave about 12 × 5,000 × 3 = 180,000 units a quarter unearned. If two engineers for a quarter could cut the wait to 1 week, the recurring saving is about 120,000 units a quarter; compare it with their fully loaded cost, using ranges, as a decision aid rather than a forecast.

Capacity and the J-curve. Improvement needs explicit capacity, and a dip after the first gains is normal. In DORA’s CD J curve, “typical of transformation programs”, quick wins and “an initial improvement” come first; then “automation increases test requirements, which are dealt with manually” and technical debt blocks progress, and getting out takes process redesign, architectural improvement and skills alongside the automation.[15] For platforms, “initial performance gains” are “followed by a dip as complexity increases”, then recovery.[19] Agree in advance how long a dip is acceptable and which metrics will show recovery.

How do you know the operating model works and nobody is quietly bypassing it?

  • Feedback loops with owners and cadences: pipeline and alerts (minutes), incident reviews (days), the monthly delivery review, a quarterly culture pulse, value stream maps every six months.[29]
  • Exception signals: production versions not from the pipeline; break-glass or admin-bypass merges; a rising share of “emergency” changes, which means the normal path is too slow; toggles past expiry;[32] checks disabled “temporarily”.
  • Metric integrity and audit sampling: each quarter, trace about ten random changes from commit to verification and confirm that failed deployments were counted; each broken link is a finding against the system, not the person.
  • Risk indicators: rising CI duration, approval wait, flaky-test rate or pages per person; a falling Westrum score.
Symptom Likely cause → diagnosis Remediation Prevention
Deployment frequency and change fail rate both rose More deployments without better tests or architecture[15] → compare failed changes’ size and coverage Shrink batches; test the risky area Review metrics together, never one alone
CI takes 40 minutes Suite bloat, no caching, integration tests on every push → profile stages, find the slowest tests Split fast and slow suites; parallelise; cache A fast-feedback objective of about 10 minutes[42]
Trunk red several times a week No required checks; flaky tests → count reverts Required checks; quarantine flaky tests with an owner Fix or revert a red trunk within minutes[36]
Deployments “succeed” but users see errors Smoke test checks only HTTP 200 → compare deploy times with error graphs Version-aware smoke test; canary with rollback Verification is part of “done”
Rollback fails Non-backward-compatible migration → inspect the change’s migrations Forward fix now; expand and contract next time (core practices) Migration review; rollback drills
Reviews wait days Large PRs, asynchronous culture → wait time versus PR size Smaller PRs; synchronous review or pairing[12] A review-response window
Platform adoption is low The “Ticket-ops” trap, an “Ivory tower” approach or a “golden cage”[19] → interview teams Run the platform as a product (PlatformOps) Customer input to the roadmap
On-call burnout Noisy alerts, toil, no support → pages per person, non-actionable share Symptom-based alerts;[38] SLOs (SRE); staffing Monthly alert review
Metrics look great, users unhappy Wrong unit, or gaming → check per-service data and failure definitions Re-anchor on user outcomes Metric integrity checks

This runbook covers change-caused failures; organisation-wide incident command belongs to IncidentOps. The first question is a judgement, not a timer: “symptoms began within 30 minutes of a deployment” is only an example threshold, and slow-burn failures are linked to their deployment in the review (data traps).

Figure 8. Recovering from a failed deployment: roll back first, then learn
noyesyesnonoyesAlert or smoke test failsIs a recent deployment aplausible cause?General incident process(IncidentOps)Declare: deployment ID,service, owner, start timeIs rollback safe? Noirreversible migration,previous artifact availableRoll back to the previousartifactDisable the feature toggle, orfix forward via the normalpipelineSymptoms resolved?Escalate: page secondary,widen investigationRecord recovered_at; markdeployment failedBlameless review within 5working daysSystem action: test, guard,smaller batch or pipelinecheck
Diagram source (Mermaid)
flowchart TB
  A["Alert or smoke test fails"] --> B{"Is a recent deployment a plausible cause?"}
  B -->|"no"| X["General incident process (IncidentOps)"]
  B -->|"yes"| C["Declare: deployment ID, service, owner, start time"]
  C --> D{"Is rollback safe? No irreversible migration, previous artifact available"}
  D -->|"yes"| E["Roll back to the previous artifact"]
  D -->|"no"| F["Disable the feature toggle, or fix forward via the normal pipeline"]
  E --> G{"Symptoms resolved?"}
  F --> G
  G -->|"no"| H["Escalate: page secondary, widen investigation"]
  H --> D
  G -->|"yes"| I["Record recovered_at; mark deployment failed"]
  I --> J["Blameless review within 5 working days"]
  J --> K["System action: test, guard, smaller batch or pipeline check"]
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class A,H risk
  class B,D,G decision
  class C,E,F,I,J,K core
  class X neutral

Text equivalent: When an alert or smoke test fails, ask whether a recent deployment is a plausible cause; if not, use the general incident process (IncidentOps). If so, declare the deployment ID, service, owner and start time, then ask whether rollback is safe (no irreversible migration, previous artifact available). If yes, roll back; if no, disable the feature toggle or fix forward through the normal pipeline. If symptoms persist, escalate (page a secondary, widen the investigation) and return to the rollback decision. Once resolved, record the recovery time, mark the deployment failed, and hold a blameless review within five working days that produces a system action: a test, a guard, a smaller batch or a pipeline check.

Worked example: d06 from Lab 2 (illustrative).

Time (UTC) Event Runbook step
16:00 d06 deployed; the smoke test checks only version and health, so it passes —
16:07 Payment-confirmation errors rise from near zero to 4% Recent deployment plausible: treat as a deployment failure
16:10 On-call declares the failure against d06 Declare
16:15 The migration only added a nullable column, but the author prefers to fix forward Rollback was safe and should have been taken
18:20 Fix committed Fix forward
19:00 d07 deployed (unplanned: counts towards rework rate) —
19:10 Errors at baseline; recovered_at recorded Record
+3 days Review: the smoke test misses payment confirmation; rollback felt “risky” because unpractised Review
+2 weeks Synthetic payment check in the smoke test; monthly rollback drill; default “roll back unless unsafe” System action

Recovery took 190 minutes instead of perhaps 20 because rollback was unpractised and the smoke test was blind to the critical journey: properties of the system, not failings of a person.

Example status: syntax-checked by bash -n; illustrative commands; deploy.sh and rollback.sh are your own scripts and were not executed here.

# 1. Confirm what is running and what ran before (from your deployment records).
./scripts/deployments.sh list --service checkout-api --env production --last 3
# 2. Roll back to the previous known-good artifact using the SAME deploy path.
./scripts/rollback.sh production
# 3. Verify with the same smoke test the pipeline uses.
./scripts/smoke-test.sh https://checkout.example.com "<previous-version-sha>"
# 4. Record the recovery so the metrics stay honest.
./scripts/deployments.sh mark-failed --id d06 --recovered-at "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
Anti-pattern (why it tempts) Warning signals Do this instead
A permanent “DevOps team” between Dev and Ops (clear ownership) Tickets to “DevOps” for every deployment A self-service platform team, or a temporary enabling team with an exit date[13][6]
Tool-first transformation (easy to buy and show) A new CI server, the same monthly release Map the value stream, fix the constraint, then choose tools[15]
Metrics as targets and leaderboards (easy to manage by numbers) Deployments split to raise frequency; failures reclassified Per-service trends and experiments[1]
More approvals after every incident (feels responsible) Growing batches and lead times Automated checks plus targeted high-risk review[11]
Big-bang programme (one plan, one budget) Months without measurable change One value stream; iterate monthly
Long-lived branches “for safety” Merge weeks, code freezes Trunk-based development and toggles[12]

Myths. DevOps trades stability for speed: top performers do well on all five metrics.[1] Only web start-ups can do it: regulated firms adapt the controls, and DORA names “using industry as a shield against improving” as a pitfall, with regulated industries as its example.[1] DevOps means microservices and Kubernetes: what matters is independent testing and deployment;[40] a modular monolith with a fast pipeline can beat a distributed monolith (KubernetesOps covers one runtime option).

Strong fit. The software changes regularly, changes matter to users, more than a handful of people contribute, and you operate it or can get production feedback. Weak fit, or a reduced form:

Situation (why full DevOps fits poorly) What still helps
Delivered once to a customer who operates it (no production feedback for you) Version control, CI, automated tests, reproducible builds
Changes very rarely, such as stable firmware (a full CD pipeline costs more than it returns) CI plus a scripted release
Safety-critical or certified software (certification sets the cadence; continuous deployment may be impossible) CI, traceability, evidence generation, continuous delivery to a certified-ready state; check your regime
A throwaway prototype (ceremony outweighs benefit) Version control and a scripted deploy
No willingness to change ownership or incentives (renaming produces anti-types B and E[13]) Fix incentives first; start with one willing team

Hidden responsibilities. On-call for what you own; pipelines and tests maintained as production code; platform funding; time for reviews; the discomfort of seeing your real metrics. Exit condition per investment: stop once it is no longer the constraint (for example, CI already under 10 minutes) and move on.

Figure 9. Decision tree: where is your delivery constraint, and should you adopt full DevOps at all?
noyesyesnoyesnoyesnoyesnoyesnoyesnoDo you operate the softwareand change it more than afew times a year?Reduced form: versioncontrol, CI, scripted release.Skip full CDIs deployment manual orrisky?Deployment automation andsmoke testsIs CI over 10 minutes, ortrunk often red?CI and test automation; fixflaky testsDo changes wait days forapproval or review?Streamline change approval;smaller PRs; synchronousreviewMust several teamscoordinate to deploy onechange?Loose coupling: architectureand team boundariesIs change fail rate or reworkrate rising?Smaller batches, better tests,observability, rollback drillsDo many teams rebuild thesame pipeline work?Platform as a product: seePlatformOpsMap the value stream again;constraint may be upstream,see AgileOps
Diagram source (Mermaid)
flowchart TB
  Q0["Do you operate the software and change it more than a few times a year?"]
  Q0 -->|"no"| R0["Reduced form: version control, CI, scripted release. Skip full CD"]
  Q0 -->|"yes"| Q1["Is deployment manual or risky?"]
  Q1 -->|"yes"| R1["Deployment automation and smoke tests"]
  Q1 -->|"no"| Q2["Is CI over 10 minutes, or trunk often red?"]
  Q2 -->|"yes"| R2["CI and test automation; fix flaky tests"]
  Q2 -->|"no"| Q3["Do changes wait days for approval or review?"]
  Q3 -->|"yes"| R3["Streamline change approval; smaller PRs; synchronous review"]
  Q3 -->|"no"| Q4["Must several teams coordinate to deploy one change?"]
  Q4 -->|"yes"| R4["Loose coupling: architecture and team boundaries"]
  Q4 -->|"no"| Q5["Is change fail rate or rework rate rising?"]
  Q5 -->|"yes"| R5["Smaller batches, better tests, observability, rollback drills"]
  Q5 -->|"no"| Q6["Do many teams rebuild the same pipeline work?"]
  Q6 -->|"yes"| R6["Platform as a product: see PlatformOps"]
  Q6 -->|"no"| R7["Map the value stream again; constraint may be upstream, see AgileOps"]
  R0 ~~~ R1 ~~~ R2 ~~~ R3 ~~~ R4 ~~~ R5 ~~~ R6
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class Q0,Q1,Q2,Q3,Q4,Q5,Q6 decision
  class R1,R2,R3,R4,R5,R6,R7 core
  class R0 neutral

Text equivalent: Questions (amber) step down the right; actions sit to their left (green; the reduced form is grey). Do you operate the software and change it more than a few times a year? If not, use a reduced form (version control, CI, scripted release). If so, take the first “yes”: deployment manual or risky → deployment automation and smoke tests; CI over 10 minutes or trunk often red → CI and test automation; changes waiting days for approval or review → streamline approval and review; several teams coordinating one deployment → loose coupling; change fail or rework rate rising → smaller batches, better tests, observability, rollback drills; many teams rebuilding the same pipeline work → platform as a product. If none applies, map the value stream again: the constraint may be upstream in planning.

The order of the questions is an editorial heuristic that puts first the constraints blocking everything downstream; your value stream map overrides it.

Weighted matrix: how to start a transformation

Link to section “Weighted matrix: how to start a transformation”

Assumptions (illustrative): a 150-engineer organisation with about 15 teams, mostly manual deployments, a supportive CTO and no platform team. The weights reflect this context, so change them for yours.

Criterion (weight) A. Pilot one value stream with an enabling coach B. Central team builds a toolchain first C. Organisation-wide mandate and tool rollout
Time to first measured improvement (25%) 5 2 3
Risk of creating a new silo (20%; higher score = lower risk) 4 2 2
Scalability to 15 teams (20%) 3 4 4
Cost in the first 6 months (15%; higher = cheaper) 4 2 1
Learning transfer and buy-in (20%) 5 2 2
Weighted score (out of 5) 4.25 2.40 2.50

Calculation for A: 0.25×5 + 0.20×4 + 0.20×3 + 0.15×4 + 0.20×5 = 1.25 + 0.80 + 0.60 + 0.60 + 1.00 = 4.25. B: 0.25×2 + 0.20×2 + 0.20×4 + 0.15×2 + 0.20×2 = 0.50 + 0.40 + 0.80 + 0.30 + 0.40 = 2.40. C: 0.25×3 + 0.20×2 + 0.20×4 + 0.15×1 + 0.20×2 = 0.75 + 0.40 + 0.80 + 0.15 + 0.40 = 2.50.

Sensitivity check. With scalability at 40%, time-to-improvement at 15% and learning transfer at 10%, A = 3.85, B = 2.80 and C = 2.80: A still leads. Once practices are proven, B, reframed as a platform product with the pilot teams as first customers, is the next step (PlatformOps); C pays the cost of change everywhere before learning anywhere.

Figure 10. Maturity progression for one value stream (this Atlas’s model)
pipeline exists, trunkprotecteddaily merges, fast tests,metrics baselineon-demand deploys,risk-tiered approvalsconstraint-drivenimprovement loop, culturemeasurednew constraint orreorganisation can move youbackLevel 1 Siloed: manual,infrequent, hand-offsLevel 2 Automated islands: CIon trunk, scripted deploysLevel 3 Integrated:trunk-based, one pipeline toproductionLevel 4 Continuous delivery:small batches, team ownsproductionLevel 5 Learning system:experiments, platform asproduct
Diagram source (Mermaid)
flowchart TB
  L1["Level 1 Siloed: manual, infrequent, hand-offs"] -->|"pipeline exists, trunk protected"| L2["Level 2 Automated islands: CI on trunk, scripted deploys"]
  L2 -->|"daily merges, fast tests, metrics baseline"| L3["Level 3 Integrated: trunk-based, one pipeline to production"]
  L3 -->|"on-demand deploys, risk-tiered approvals"| L4["Level 4 Continuous delivery: small batches, team owns production"]
  L4 -->|"constraint-driven improvement loop, culture measured"| L5["Level 5 Learning system: experiments, platform as product"]
  L5 -.->|"new constraint or reorganisation can move you back"| L3
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  class L1 risk
  class L2,L3 neutral
  class L4,L5 core

Text equivalent: Five levels top to bottom, each arrow naming the transition: Siloed → (pipeline exists, trunk protected) → Automated islands → (daily merges, fast tests, metrics baseline) → Integrated → (on-demand deploys, risk-tiered approvals) → Continuous delivery → (constraint-driven loop, culture measured) → Learning system. A dashed arrow from Level 5 back to Level 3: a new constraint or reorganisation can move you back.

Level Observable behaviour (evidence) Exit criteria Typical constraint
1. Siloed Monthly or slower releases; manual deployment by another team; freezes (release calendar) Every change built and tested on a protected trunk Nobody owns the end-to-end flow
2. Automated islands CI on trunk; scripted but manual deployment; long branches (CI history, branch ages) ≤ 3 active branches, daily merges;[12] metrics baselined Slow or flaky tests; review queues
3. Integrated One pipeline to production; same artifact everywhere (deployment records) On-demand deployment in working hours; no manual approval for standard changes Approval process; coupled architecture
4. Continuous delivery Small batches; team on call; rollback rehearsed (metric trends, drill records) Monthly constraint review for two quarters; Westrum survey in use Cross-team dependencies; platform gaps
5. Learning system Hypothesis-driven changes; shared incident learning; platform as product (experiment log) None: keep looping Complacency; reorganisation

For one pilot value stream with one team, a part-time coach and a sponsor; regulated environments often need a longer phase 3 to agree evidence with audit.

Phase (owner) Actions Milestones
Days 1–30: see and stabilise (team lead, coach) Value stream map and five-metric baseline (Labs 1 and 2); deployment records; protect trunk; fix the top three flaky tests; list manual deployment steps Map and baseline published; one painful step automated
Days 31–60: automate the path (team, platform engineer) Build once and promote; scripted deployment with smoke test and rollback (reference implementation); trunk-based working agreement; rollback drill; Westrum survey Zero manual steps for standard changes; fast feedback in about 10 minutes
Days 61–90: govern and spread (sponsor, team lead) Risk tiers agreed with security and audit; monthly delivery review; first improvement experiment; playbook for the next teams Automated-promotion share up; approval wait down; lead time falling with instability flat; next two value streams chosen

Dependencies: a sponsor protecting improvement capacity; production telemetry access; a security and compliance contact from day 30, not day 89.

Quick start (any team, this week)

  • Everything needed to build and deploy is in version control, including pipeline and monitoring configuration[36][38]
  • Every push triggers a build and fast tests; trunk is protected (review and a green build required)
  • The service exposes a health endpoint that reports its version
  • Deployments are recorded automatically

Pipeline preflight (before calling a pipeline production-ready)

  • Builds once; the same artifact is promoted through all environments[33]
  • Fast feedback in about 10 minutes or less[42]
  • Smoke test checks version and one critical user journey; rollback is automated and rehearsed
  • Pipeline credentials are least-privilege and short-lived; pipeline definition changes require review

Monthly delivery review

  • Five metrics per service, trend over at least three months
  • Every failed deployment reviewed and its system action tracked; unplanned follow-ups marked as rework
  • One constraint chosen and one experiment defined, with its expected metric movement
  • Exceptions reviewed: break-glass use, bypassed checks, emergency changes, expired toggles

1. One-page DevOps charter for a value stream

Value stream:            <service or product name>
Sponsor:                 <name, role>          Team lead: <name>
Mission (1 sentence):    Deliver small, safe changes to <users> on demand and learn from every change.
Current baseline (date): lead time <median>, deploy frequency <n/period>, change fail rate <%>,
                         recovery time <median>, rework rate <%>
Biggest constraint:      <from the value stream map>
90-day goals:            <direction for 2-3 metrics, e.g. lead time down, instability flat>
Improvement capacity:    <% of team time, agreed with sponsor>
Controls we must keep:   <e.g. segregation of duties, data residency>; evidence: <how automated>
Non-goals:               <e.g. reorganising other teams, tool replacement>
Review cadence:          monthly delivery review on <day>; next value stream map on <date>

2. Architecture decision record: adopting trunk-based development

ADR-0007: Adopt trunk-based development for checkout-api
Status:       Accepted (2026-10-16)
Context:      Median branch age 9 days; 2-day merge integration before each release; code freeze 3 days/month.
Decision:     Branches live < 1 day; <= 3 active branches; merge to main at least daily; release toggles for
              incomplete work; required review + green build to merge.
Evidence:     DORA trunk-based development capability (practices and measures); our value stream map (date).
Consequences: + smaller reviews, no freeze, faster feedback
              - toggle carrying cost; requires CI < ~10 min; requires prompt reviews
Review date:  2027-01-15 (compare branch age, freeze days, change fail rate with baseline)

3. Delivery review scorecard (monthly, per service)

Service: <name>      Month: <YYYY-MM>      Reviewed by: <team, platform rep, manager>
Item                                   Last month   This month   3-month trend   Action
Change lead time (median / p90)
Deployment frequency
Change fail rate
Failed deployment recovery time (median)
Deployment rework rate
CI feedback time (p90)
Approval wait time (median)
Constraint chosen and experiment

4. Team working agreement (delivery)

1. We merge small changes to main at least daily; no branch lives longer than a day.
2. Pull requests get a first review within <agreed window>; we prefer pairing for risky changes.
3. A red main is everyone's top priority: fix or revert within 15 minutes.
4. Every deployment goes through the pipeline. Break-glass use is reviewed the next working day.
5. If a deployment fails, we roll back first unless rollback is unsafe, then learn.
6. Every release toggle has an owner and an expiry date; we remove expired toggles in the next sprint.
7. Incident reviews are blameless and end with system actions, not names.

The deployment event record and the smoke test in the reference implementation are reusable too.

Is DevOps a role, a team or a culture?

Primarily a way of working, owned by the teams that build and run services. “DevOps engineer” usually names a platform, build or infrastructure role, and a permanent “DevOps team” between Dev and Ops is a known anti-pattern (What DevOps is not).

Do developers have to be on call?

Usually, for the services they own: “you build it, you run it”.[10] It works only with symptom-based alerts, runbooks, sensible rotas and, for critical services, SRE partnership; if on-call burns people out, fix the alerts and the toil first.

Can DevOps work in banking, healthcare or government?

Yes, with the controls automated rather than removed. What changes is the evidence you keep and who you involve early (audit, risk; see risk controls). Your regulator and auditor, not this page, decide what is acceptable.

Why five metrics? I learned “the four key metrics”.

DORA added deployment rework rate in 2024 and moved failed deployment recovery time into the throughput group; in 2023 it had already redefined “time to restore” as recovery from change-caused failures only.[27] Older articles and tools may still use four metrics and the old names.

Should we compare teams, or aim to be “elite”?

Neither: DORA lists competing with other teams as a pitfall,[1] and “elite” is one year’s top survey cluster (in 2022 there was none; see clusters). Compare each service with its own history.

Is continuous deployment always the goal?

No. Continuous delivery means you can deploy any good build on demand; continuous deployment means every passing change goes out automatically, and you must be doing continuous delivery first.[30] Some businesses choose a slower release pace for good reasons; the capability to deploy on demand is what matters.

Established (use now). Platform engineering as the scaling mechanism for DevOps, which “often follows” a J-curve too and has possible throughput and stability costs if poorly managed.[19][59] Socio-technical design: shaping team boundaries deliberately to get the architecture you want (Conway’s law, Team Topologies).[21][37] Rework as a first-class signal alongside change fail rate.[27]

Fast-moving (as of October 2026). AI-assisted delivery: re-check DORA’s 2024–2025 research before relying on it.[59][28][60] Agentic tools that open pull requests and run pipelines raise questions about review load, provenance and permissions: treat the agent as a contributor whose changes go through the same pipeline and controls as anyone else’s. Interoperable delivery events: CDEvents, an incubated CD Foundation project extending CloudEvents, aims to give CI/CD tools a shared event vocabulary, which would ease metrics across mixed toolchains.[48]

Speculative or marketing. “Autonomous DevOps” or “self-driving pipelines” that need no human judgement, and products promising “DevOps in a box”: no source opened for this page shows either working as described.

Track First day First week First month, then specialise
Beginner (Git basics, what tests are) What DevOps is, the glossary, Lab 2 Build a small app with CI and a scripted deploy; break and fix it Contribute to a team pipeline; join an incident review
Practitioner (scripting, one CI system, containers) Reference implementation; Lab 2; the trunk-based playbook Lab 3 with the failure drill; a rollback drill Halve CI time or remove all manual deploy steps for one service; then SRE, PlatformOps, DevSecOps, ReleaseOps or GitOps
Leader / architect (how delivery is funded and governed) The problem, the metrics, the decision framework and the judgement call; Lab 1 with your team Baseline the five metrics for two services; run a delivery review Run the roadmap’s first 30 days with one pilot team; then team design, change governance (ITOps) and cost (FinOps)

Foundational reading: Accelerate (2018)[5]; The DevOps Handbook, 2nd edition (2021)[9]; Fowler on continuous integration[22] and continuous delivery[30]; DORA’s capability guides.[17]

Decide which value stream to pilot and who owns it end to end, what share of capacity is protected for improvement, which controls must be kept and how they are evidenced automatically, and whether to fund a platform team (only once one team has proven the practices). Measure per service: change lead time, deployment frequency, failed deployment recovery time (throughput); change fail rate, deployment rework rate (instability); improve them together and never rank teams.[1] Watch for the DevOps team silo, title rebranding, tool-first programmes, metrics as targets, approvals added after every incident and AI-inflated pull requests. Start with the 90-day roadmap.

A judgement call: keep the change advisory board or replace it?

Link to section “A judgement call: keep the change advisory board or replace it?”

Situation (illustrative). An insurer’s policy-administration team sends every change, from typo fixes to premium-calculation logic, to a weekly CAB; the median approval wait is four days. Last year the CAB rejected 3 of about 400 changes, and two serious incidents came from approved changes. The CTO wants speed; the head of risk fears that removing the CAB looks like removing a control.

Option 1: keep the CAB for everything, but meet twice a week. It looks safe, is quick to agree, and avoids a conversation with the auditors.

Option 2: risk-tiered automated change control. Standard changes are promoted automatically with recorded peer review, passing tests and checks, and a machine-generated deployment record. High-risk changes (premium calculation, data migrations, access control) get explicit review by named risk owners, through an approval gate the platform plan actually provides (see the plan caveat). The CAB becomes a forum for cross-team coordination, trends and exceptions.

Assumptions. Reliable automated tests for the standard tier; an audit function willing to evaluate automated evidence; genuine peer review; regulations that specify outcomes (segregation of duties, traceability) rather than a meeting.

Evidence. DORA found that heavyweight approval processes hurt delivery performance, and found no evidence that more formal external review is associated with lower change fail rates; recorded peer review can carry the segregation-of-duties control (risk controls).[11] Locally, the team’s own data shows a 0.75% rejection rate (3 of about 400) and incidents slipping past the board anyway: the CAB adds wait time without adding much detection.

Why the attractive choice can be wrong. Option 1 halves the wait but keeps the cause: every change still queues for people who lack the context to judge it, batches stay large, and DORA notes that adding process in response to instability tends to raise lead times and batch sizes.[11] Why the other choice can also be wrong. Option 2 fails if the tests are thin, the peer review is a formality, or audit is informed after the fact: a visible control is replaced by an invisible gap.

Decision process. Pilot Option 2 on one service for a quarter, with audit involved from day 1 and the tiers defined in writing; measure approval wait, automated-promotion share, change fail and rework rates against the baseline; sample ten changes a month for evidence quality; keep the CAB for the pilot’s high-risk tier.

Expected result, with uncertainty. Wait time should fall sharply for standard changes; the effect on change fail rate is uncertain in the first quarter (the J-curve may apply).[15] If instability rises and evidence quality is poor, stop and fix tests and reviews first. If audit rejects the evidence model, you have learned that cheaply on one service.

After working through this page you should be able to:

  1. Explain DevOps as a socio-technical system using the Three Ways and CALMS, and say why a title or tool is not DevOps.
  2. Define and compute DORA’s five delivery metrics for one service, and interpret them responsibly.
  3. Design a delivery pipeline that builds once, promotes the same artifact, verifies with a smoke test and records deployments.
  4. Diagnose a delivery constraint with a value stream map and choose the next improvement.
  5. Evaluate team structures and change-governance options against the evidence and the anti-patterns.

Answer these before opening the answers.

1. A team doubled its deployment frequency in a quarter, and its change fail rate went from 10% to 25%. Its manager calls it a success. What do you say?

Not yet. DORA warns against relying on one metric.[1] Throughput rose at the cost of stability, the pitfall of deploying more often without smaller batches or better tests and architecture.[15] Look at the size and test coverage of the failed changes, and check the rework rate.

2. What is the change lead time for a commit made Friday 17:00 UTC and deployed Monday 09:00 UTC, and what does it tell you?

64 hours, because DORA’s change lead time runs from commit to running in production.[1] It mostly reflects a weekend wait, not pipeline speed, so decide whether weekend deployment matters for this service before “fixing” it.

3. Your pipeline went green, but 10 minutes later the team rolled back because checkout errors spiked. Does this deployment count towards change fail rate?

Yes. Change fail rate counts deployments that “require immediate intervention following a deployment”, not red pipelines.[1] Had the team fixed forward with an unplanned deployment instead, that follow-up would also count towards the rework rate.

4. A VP proposes a new “DevOps team” of six to own all pipelines and production deployments for 20 product teams. What do you propose instead?

That is the “DevOps team silo”, a third group that keeps the hand-offs.[13] Propose a platform team offering self-service pipelines as a product, so product teams deploy their own services, or a temporary enabling team with an exit date.

5. In a value stream map, code review has 0.5 h process time and 2 days lead time, and manual QA has 3 h process time, 4 days lead time and a %C/A of 70%. Where do you start, and why?

Usually manual QA: the larger wait (4 days for 3 hours of work), and QA can use only 70% of the changes it receives. In DORA’s definition %C/A describes a step’s input,[29] so the fix sits upstream: automate the common checks in CI and tighten review so fewer defective changes reach QA, then shrink QA’s queue. Review waits are cheaper to fix (smaller PRs, synchronous review) and can be tackled in parallel. Improving non-bottleneck steps has little effect.[29]

6. Why does the reference pipeline post the deployment event with if: ${{ !cancelled() }} rather than only on success?

So that failed deployments are recorded too; otherwise the change fail rate is under-counted. GitHub’s documentation also advises !cancelled() rather than always() for steps that should run after failures but not after cancellation.[62]

7. After adopting an AI coding assistant, pull requests grew threefold and rework rose. Name three capabilities from DORA’s AI research you would strengthen, and why.

Working in small batches (large generated diffs are hard to review and test), strong version control practices (frequent commits and easy rollback), and a clear, communicated AI stance (shared rules for when and how generated code is used and reviewed).[60] DORA’s small-batches guidance warns that reviewing machine-generated code may cost more per line.[43]

DevOps began as a complaint about a wall between two departments and, through more than a decade of DORA research, became one of the most studied ideas in software delivery.[7] Its lasting insight is simple to state and hard to live by: the people who change a system should feel, quickly and without blame, the consequences of their changes, and the path from idea to user should be short, automated and observable enough that this feedback is cheap.

Teams that buy the tools without the ownership ship the same problems faster, and AI amplifies whichever delivery system it lands in. You will not “finish” DevOps: see your value stream, measure it per service, fix the biggest constraint, and repeat. Organisations that keep doing that tend to deliver faster and more safely.[1][15]

All sources were opened and checked on 2026-10-16; the evidence ledger (research/devops-ledger.md) maps each claim to its source and lists what could not be fetched automatically.

Further reading (not cited above).

Changelog.

  • 2026-10-16, r3 follow-up (orchestrator): OIDC subject tied to deployment-branch limits and no administrator bypass; DORA’s flaky-test advice quoted with its stated reason.
  • 2026-10-16, r3: regrouped into 14 parts with nested sub-sections (Blueprint v2); cut from 17,818 to 14,876 words by removing restatements, with schema-migration detail handed to DBOps; Jenkins approval cell corrected (submitter); Figure 3 redrawn without floating edge labels; Figure 9’s text equivalent corrected.
  • 2026-10-16, r2: ten figures redrawn for a narrow column; the J-curve described accurately for both continuous delivery and platform engineering; rolled %C/A rounding corrected.
  • 2026-10-16, r1: GitHub plan limits dated; OIDC deploy credentials; DORA’s %C/A definition; clusters, team profiles, test stages and a schema-change playbook added; quotations made verbatim.
  • 2026-10-16: first edition (pilot); Lab 2 and the smoke test executed locally.

  1. DORA’s software delivery performance metrics — DORA (Google Cloud), updated 2026-01-05. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  2. What is DevOps? — Microsoft Learn, updated 2026-09-04. Checked 2026-10-16. ↩︎ ↩︎

  3. DevOps: A Software Architect’s Perspective — L. Bass, I. Weber, L. Zhu; Addison-Wesley, 2015, ISBN 978-0-13-404984-7 (publisher page; the book’s text was not opened for this page). Checked 2026-10-16. ↩︎

  4. DevOps — Wikipedia, where the wording of the Bass, Weber and Zhu definition was checked (it cites the 2015 book). Checked 2026-10-16. ↩︎

  5. Accelerate: The Science of Lean Software and DevOps — N. Forsgren, J. Humble, G. Kim; IT Revolution, 2018. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  6. There’s No Such Thing as a “Devops Team” — Jez Humble’s Continuous Delivery website, 2012-10-19. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  7. DORA Research Program — DORA, report archive 2014–2025. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  8. About devopsdays — devopsdays global organisers. Checked 2026-10-16. ↩︎ ↩︎

  9. The DevOps Handbook, Second Edition — G. Kim, J. Humble, P. Debois, J. Willis, N. Forsgren; IT Revolution, 2021 (1st ed. 2016). Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  10. ACM Queue: Interview with Amazon’s Werner Vogels — Jeff Barr, AWS News Blog, 2006-05-16 (quoting ACM Queue, 2006). Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  11. Capabilities: Streamlining change approval — DORA, updated 2025-10-30. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  12. Capabilities: Trunk-based development — DORA, undated page. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  13. DevOps Topologies — Matthew Skelton and Manuel Pais (CC BY-SA 4.0), original 2013. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  14. Capabilities: Generative organizational culture — DORA (Westrum typology), undated page. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  15. Capabilities: Continuous delivery — DORA, undated page. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  16. What DevOps Means to Me — John Willis, Chef blog, 2010-07-16. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  17. DORA capability catalogue — DORA (34 capabilities listed when checked). Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  18. How SRE Relates to DevOps — N. R. Murphy, L. Fong-Jones, B. Beyer et al., The Site Reliability Workbook, Google/O’Reilly, 2018. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  19. Capabilities: Platform engineering — DORA, updated 2026-01-12. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  20. Digital Operational Resilience Act (DORA) — EIOPA (Regulation (EU) 2022/2554). Checked 2026-10-16. ↩︎

  21. Conway’s Law — Mel Conway (original paper: Datamation, April 1968). Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  22. Continuous Integration — Martin Fowler, 2000, revised 2024-01-18. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  23. Continuous integration for the world (Agile 2011) — Patrick Debois’s blog, 2011-09-06. Checked 2026-10-16. ↩︎

  24. Velocity: Flickr on Devs, Ops and Teamwork — Data Center Knowledge, 2009-06-25. Checked 2026-10-16. ↩︎ ↩︎

  25. The Three Ways: The Principles Underpinning DevOps — Gene Kim, IT Revolution, 2012-08-22. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  26. DORA Joins Google Cloud — DORA, 2018-12-20. Checked 2026-10-16. ↩︎

  27. A history of DORA’s software delivery metrics — DORA, updated 2026-01-02. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  28. State of AI-assisted Software Development 2025 — DORA, 2025. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  29. Capabilities: Visibility of work in the value stream — DORA, undated page. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  30. Continuous Delivery — Martin Fowler, 2013-05-30. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  31. Canarying Releases — The Site Reliability Workbook, chapter 16, Google/O’Reilly, 2018. Checked 2026-10-16. ↩︎

  32. Feature Toggles (aka Feature Flags) — Pete Hodgson, on Martin Fowler’s website, 2017-10-09. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  33. Capabilities: Deployment automation — DORA, undated page. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  34. Capabilities: Transformational leadership — DORA, undated page. Checked 2026-10-16. ↩︎

  35. Principles of continuous delivery — Jez Humble’s Continuous Delivery website. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  36. Capabilities: Continuous integration — DORA, undated page. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  37. Team Topologies: Key Concepts — Team Topologies (M. Skelton, M. Pais). Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  38. Capabilities: Monitoring and observability — DORA, undated page. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  39. Accelerate State of DevOps Report 2023 — DORA, 2023. Checked 2026-10-16. ↩︎

  40. Capabilities: Loosely coupled teams — DORA, updated 2025-10-20. Checked 2026-10-16. ↩︎ ↩︎

  41. Capabilities: Database change management — DORA, undated page. Checked 2026-10-16. ↩︎ ↩︎

  42. Capabilities: Test automation — DORA, updated 2025-07-17. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  43. Capabilities: Working in small batches — DORA, updated 2025-12-08. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  44. Parallel Change — Danilo Sato, on Martin Fowler’s website, 2014-05-13. Checked 2026-10-16. ↩︎

  45. DORA Quick Check — DORA. Checked 2026-10-16. ↩︎ ↩︎

  46. SP 800-218, Secure Software Development Framework (SSDF) Version 1.1 — NIST, February 2022. Checked 2026-10-16. ↩︎ ↩︎

  47. SP 800-218 Rev. 1 (Initial Public Draft), SSDF Version 1.2 — NIST, 2025-12-17 (comment period closed 2026-01-30). Checked 2026-10-16. ↩︎

  48. CDEvents — CDEvents project, Continuous Delivery Foundation. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  49. Workflow syntax for GitHub Actions — GitHub Docs. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  50. Get started with GitLab CI/CD — GitLab Docs. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  51. Jenkins — Jenkins project home page. Checked 2026-10-16. ↩︎ ↩︎

  52. Tekton — Tekton project (CNCF incubating). Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  53. OpenFeature introduction — OpenFeature (CNCF incubating project). Checked 2026-10-16. ↩︎

  54. Using a Jenkinsfile — Jenkins User Handbook. Checked 2026-10-16. ↩︎

  55. Deployments and environments — GitHub Docs (reference: per-feature plan availability). Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  56. Deployment approvals — GitLab Docs (Tier: Premium, Ultimate). Checked 2026-10-16. ↩︎ ↩︎

  57. Pipeline: Input Step — Jenkins pipeline steps reference (the input step and its submitter parameter). Checked 2026-10-16. ↩︎

  58. GitHub’s plans — GitHub Docs. Checked 2026-10-16. ↩︎ ↩︎

  59. Accelerate State of DevOps Report 2024 — DORA, 2024. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  60. Introducing DORA’s inaugural AI Capabilities Model — Google Cloud Blog (K. M. Storer, D. DeBellis), 2025-09-24. Checked 2026-10-16. ↩︎ ↩︎ ↩︎ ↩︎

  61. Managing environments for deployment — GitHub Docs. Checked 2026-10-16. ↩︎

  62. Evaluate expressions in workflows and actions — GitHub Docs. Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  63. OpenID Connect reference — GitHub Docs. Checked 2026-10-16. ↩︎ ↩︎

  64. actions/checkout — GitHub (README usage shows @v7). Checked 2026-10-16. ↩︎

  65. actions/setup-python — GitHub (README usage shows @v7). Checked 2026-10-16. ↩︎

  66. OpenID Connect — GitHub Docs (concepts). Checked 2026-10-16. ↩︎ ↩︎ ↩︎

  67. Announcing DORA 2021 Accelerate State of DevOps report — Google Cloud Blog (D. Smith), 2021-09-22. Checked 2026-10-16. ↩︎

  68. The 2023 Accelerate State of DevOps survey is open — Google Cloud Blog (D. DeBellis, B. Washington), 2023-05-27. Checked 2026-10-16. ↩︎

  69. Announcing the 2025 DORA Report — Google Cloud Blog (N. Harvey, D. DeBellis), 2025-09-24. Checked 2026-10-16. ↩︎

Related Ops

PlatformOps

PlatformOps is a less common name for platform engineering. This page uses it for the operating half: running an internal developer platform as a product, with service levels, support, upgrades and deprecation that keep its self-service golden paths trustworthy.

SRE (Site Reliability Engineering)

Site Reliability Engineering (SRE) runs production services as a software-engineering problem: it sets explicit reliability targets (SLOs) from users' experience and uses the remaining error budget to decide how fast to ship and when to stop and fix.

DevSecOps

DevSecOps is the practice of building security into the software delivery pipeline and into the teams that run it, so that every change is checked, traceable and safe to ship without a separate security phase that stalls delivery.

ReleaseOps

ReleaseOps is an informal label for turning deployed code into a deliberate, reversible change for users: versioning, cadence, progressive exposure, feature flags, rollback and release records. The exact name is also a ServiceNow product.

GitOps

GitOps is a way of operating software systems in which the desired state is declared in a versioned, immutable store such as Git, and software agents continuously pull it and reconcile the running system to match.

DevExOps

DevExOps is a rare, unstandardised label. This page uses it for running developer experience as a continuous loop: measure friction with surveys and system data, prioritise it, get it fixed and verify the fix, without turning the data into surveillance of individuals.

InfraOps

InfraOps is informal shorthand for infrastructure operations. This Atlas uses it for running infrastructure through code: declaring it, reviewing every change as a plan, applying it from a pipeline and keeping the tool's state in step with reality.

TestOps

TestOps is the practice of running an automated test suite as a production service: one whose users are developers and whose product is a fast, trustworthy pass/fail verdict on every change. The label is young and vendor-popularised; the practices under it are well established.

Practise and get certified

From xOps School

Practise DevOps and get certified

The free DevOps track on xOps School has study notes, a 25-question practice quiz with explanations, and a verifiable certificate when you score 70% or more. Sign in with Google to start.

For teams

Instructor-led training

Live batches for your team, with completion certificates and reports for L&D/HR.

Source: master.md (the editorial source of this page) · built 2026-10-16 · diagrams rendered with @mermaid-js/mermaid-cli 11.17.0 (mermaid 11.17.2)