ProductHow it worksPricingBlogDocsLoginFind Your First Bug
Quara the frog standing beside a vertical panel of twelve status lights, ten glowing steady lime, one dimmed amber, one dark, above a single large lime go/no-go toggle at the base of the panel
TestingRelease ManagementQA Process

Release Readiness Checklist: All 12 Gates, Filled In

Tom Piaggio
Tom PiaggioCo-Founder at Autonoma

A release readiness checklist is the set of twelve gates a release candidate has to clear before it ships: smoke, sanity, regression, system, integration, acceptance, non-functional thresholds, operational readiness, a tested rollback, feature-flag state, a clean data migration, and the go or no-go decision itself, recorded with a name and a timestamp. Each gate needs an owner and a checkable pass condition. Most checklists online describe those rows and stop there. Below is one filled in against a real release candidate, with the pass, waived, and blocked verdicts a working checklist actually produces.

rc-2026.08.4 sat at the gate six hours past its scheduled promote window. Nothing was down. Twelve gates stood between that candidate and a shipped release, and four of them were still marked "in progress" on a whiteboard nobody trusted enough to type "pass" into without rechecking it first.

This is written for the person who has to make that call: an engineer, an SDET, or a release owner deciding whether a candidate ships, or handed a checklist and told to run it. It isn't written for the QA lead building a suite-allocation strategy across an org, the reader asking whether an AI-generated suite tests anything real, or someone picking edge-case inputs for one test case, a full level of detail below anything here. What follows is all twelve gates, filled in against a real release candidate. Every software release checklist you can find online lists roughly these rows; almost none of them show you what the release testing behind a row actually has to produce before you can write "pass" in it.

The Release Readiness Checklist for rc-2026.08.4

rc-2026.08.4 is a release candidate for a checkout and payments update, cut from main after a two-week feature branch merged. Twelve gates stand between that candidate and a shipped release. Each row's pass condition works the same way entry and exit criteria do for a single test phase, just scoped to an entire release: a concrete, checkable condition, not a restatement of the gate's name. If you need the underlying definitions first, smoke, sanity, and system testing are covered elsewhere; this page assumes you already have them and goes straight to the filled artifact.

One release candidate, six gates shownCommit to go/no-go, in orderCommitSmokeSanityRegressionSystemAcceptanceOATGoNo-Go

Six gates in order, from commit to the decision. The full checklist below covers twelve.

All twelve release readiness gates, with pass conditions, owners and evidence sources, filled in for release candidate rc-2026.08.4.
GateWhat "pass" actually meansOwnerEvidence sourceStatus
Smoke green on the candidate34/34 smoke checks green, zero retries, on rc-2026.08.4Release engineerCI smoke job runPass
Sanity on the changed area6 checks on the checkout diff (PR #4471) all greenFeature ownerCI sanity job, PR #4471Pass
Regression suite green or triaged412/418 green; 6 red triaged with tickets, none blockingQA leadRegression run + triage docWaived
System test vs the spec28/28 spec-mapped scenarios pass end to endSDETSystem test report vs specPass
Integration/contract checks14/14 contract tests green against the payments brokerBackend leadPact broker verificationPass
Acceptance signed (UAT)Product owner signed off on all 9 acceptance criteriaProduct ownerSigned UAT documentPass
Non-functional thresholds metp95 under 400ms at 2x peak; zero critical axe violationsPerf/accessibility ownerLoad report + axe scanBlocked
Operational acceptance (OAT)Runbook current, backup verified in 24h, on-call briefedSRE on-callOAT checklist documentPass
Rollback tested, not just documentedRollback to prior tag done in staging, under 5 minutesRelease engineerRollback drill logPass
Feature flags in known stateAll 3 flags match intended launch state, config diffedFeature ownerFlag config audit logPass
Data migration dry-run cleanDry run vs prod snapshot, zero errors, row counts matchData/backend leadMigration dry-run logPass
Go/no-go decision recordedDecision logged with name, timestamp, and blocker referenceRelease ownerGo/no-go log entryPass (No-Go)

Copy the Gate and Owner columns straight into your own release doc; the pass conditions below are one candidate's, and yours should name your own jobs, brokers and thresholds. Three rows are worth stopping on, because a checklist with twelve green ticks would hide exactly what they show. Row three is waived, not passing: six regression failures are pre-existing, ticketed, and confirmed unrelated to this release, so a human accepted the risk instead of blocking on flakiness. Row seven is blocked: load testing put p95 latency at 640 milliseconds against a 400 millisecond threshold at twice expected peak traffic, and no waiver was requested. Row twelve records the consequence: a no-go, logged with a name, a timestamp, and a pointer back to row seven. Row one's zero-retries condition is worth interrogating further than a single pass or fail; smoke test metrics covers the arithmetic behind whether that gate is actually catching anything.

A checklist with twelve green rows and nothing else on it isn't evidence of a healthy release. It's evidence nobody tested hard enough to trip a threshold.

Machine-Signable vs Human-Signable: What Still Needs a Name Attached

Eight of the twelve rows above are the output of something running: a suite executing, a broker verifying a contract, a dry run replaying a migration against a snapshot. None of those needed a person to interpret them, only to configure what counts as passing in the first place. Rows like rollback and feature-flag state overlap heavily with what a deployment checks gate already verifies before a build promotes. Feature-flag state in particular is only machine-signable if the flags have a declared intended state to diff against, which is the discipline Martin Fowler's write-up on feature toggles calls out as the difference between a toggle and a leftover. The other four rows are different in kind. Acceptance sign-off is a product owner's judgment that the built thing matches what the user actually needed, which a passing suite cannot establish on its own. A waiver is a documented decision to accept a known risk, which requires someone to own that decision by name. A blocked non-functional threshold needs a specialist's read on what "acceptable" means for this release, not just a number compared to a limit. The go/no-go call is always a person signing a name to a consequence, whatever the eleven rows above it say.

Which release readiness rows a machine can sign, and which need a person's name.
Machine-signable (publishes its own status)Human-signable (needs a name attached)
Smoke, sanity, regression, systemAcceptance sign-off (UAT)
Integration/contract checksRisk waiver reasoning
Rollback drill, feature flags, migrationNon-functional threshold call
Evidence links and run logsGo/no-go decision itself
Two kinds of checklist rowOne side needs a nameMachine-signableSmoke, sanity, systemIntegration, rollbackFlags, migrationPublishes its own statusHuman-signableAcceptance sign-offRisk waiver reasoningGo/no-go callNeeds a name attached

Eight rows report themselves. Four still need a person's name on the decision.

Why the Checklist Used to Go Stale Inside a Single Release

A release-readiness checklist was, for a long time, a manual bookkeeping artifact. Google's SRE book makes the same point about release engineering as a discipline: reliable services depend on a reproducible release process, not on someone remembering to run one. Someone ran the smoke suite by hand, or waited on whoever did, then typed "pass" into a spreadsheet cell. An hour later the underlying gate moved: regression turned up a new failure, a load test finished with a worse number, a rollback drill that passed last week failed against this week's schema. The cell kept saying what it said when someone last looked at it, which describes the checklist's freshness, not the release's readiness.

When each gate publishes its own status the moment it finishes running, the checklist stops being a document someone fills in and becomes a query against gates that are already reporting for themselves. The result reads closer to what a QA metrics dashboard already does for the rest of a team's testing signal. The only rows still worth filling in by hand are the ones a machine was never going to sign: the judgment calls above, acceptance, the waiver, the call itself.

The checklist stopped being a document you fill in. It became a dashboard query you read.
Two loops, only one resolvesSame checklist, two different update mechanismsOld loop, never resolvesHuman types a statusGate moves an hour laterCell is already staleNew loop, resolves liveGate publishes its statusChecklist reads it liveAlways current

One loop repeats because it depends on memory. The other repeats because it doesn't need to.

This checklist answers one question: can this candidate ship. Who convenes the room, who holds veto, and what happens the moment a no-go is recorded sits a level up. The checklist lives here; the process lives in the release management process, which the checklist you're reading feeds directly.

How Autonoma Keeps the Checklist Current

The staleness loop above is the exact failure mode our own team kept running into before we built around it. A smoke gate, a sanity check on the changed area, a regression pass, a system test against the spec, even acceptance execution: every one of those rows used to depend on someone remembering to rerun a suite and retype a cell, and the checklist was only ever as fresh as the last person who touched it.

Our agents read the codebase directly rather than working from a saved script, and they verify against the running application rather than a snapshot from last week. One agent plans the test cases a given change actually needs to prove out; another runs them against a live preview of the build; a third reviews each result and separates a real regression from a flaky run or a mismatched plan. The Diffs Agent re-reads every pull request and updates the suite to match it, so the checks feeding rows like smoke, sanity, regression, and system test are current the moment the code changes, not the last time someone remembered to update them.

That covers the behavioral, execution-driven half of this checklist: smoke, sanity, regression, system, and integration/contract execution can publish their own status the moment a run finishes, instead of waiting on a person to check a box. Rollback and feature-flag state still depend on your own deployment tooling to report; monitoring and on-call readiness still come from your own observability stack, not from us. Acceptance's judgment call, the waiver's reasoning, and the go/no-go decision itself stay exactly where the next section puts them, with a person, by name.

What This Checklist Deliberately Leaves to a Person

Not every row on this checklist should be automatic, and a version of this page that pretended otherwise would be worth less, not more. Non-functional thresholds, like row seven's load number, need a specialist's tool built for that job. Load and accessibility testing are their own disciplines, with their own thresholds and their own false positives, and no general-purpose test runner should be trusted to set them. Acceptance sign-off is validation, whether the built thing is right for the user, judged by the person who owns that answer, not verification of whether it was built to spec. Row eight's operational acceptance conditions, runbook currency, backup verification, on-call readiness, are their own gate; operational acceptance testing covers what OAT actually verifies beyond this one summary row. A waiver is a risk decision with a name attached, and a go/no-go call is the same kind of decision at a bigger scale. None of those rows belongs to one vendor. A checklist that routed every one of them to a single tool, or a single team, would get thrown out by the first person asked to defend it to an auditor, and rightly so.

This carveout matters because of who's reading this page. It's written for the engineer, SDET, or release owner staring at a candidate sitting at a gate, not for the person designing a test-allocation strategy for an entire org, or deciding which values to feed into a single test case. Those are real questions. They're just not this one.

Reading Pass, Waived, and Blocked as a Decision, Not a Report Card

Twelve green cells look reassuring and mean almost nothing on their own, because the three-value vocabulary is doing the real work. Pass is an objective, machine-checked condition met exactly as declared. Waived is a Pass a human accepted despite a known gap, with a reason attached and an owner's name on it. Blocked stops the release outright, and it takes exactly one Blocked row to do it, regardless of how many of the other eleven say Pass. rc-2026.08.4 has eleven rows that would let it ship and one that won't, and the checklist's job is making sure that one row wins the argument.

Blocked overrides eleven Pass rowsHow the three statuses decidePassObjective, machine-checkedWaivedNeeds a documented reasonBlockedStops the releaseGoNo-Gorc-2026.08.4 recorded: No-Go

Pass and Waived clear a release on their own. One Blocked row overrides both.

That's also why row twelve exists as its own row instead of being inferred from the other eleven. Recording the decision, who made it, when, and what it was waiting on, is what turns "the checklist looked fine" into an answer you can hand to someone asking six months later why a specific release shipped when it did.

Print this checklist for your own release, but write down real evidence sources for each row before you trust a single cell: a link to the CI run, the pact broker, the load report, the signed UAT document, not a person's memory of having looked at it earlier that day. If half of your twelve rows still depend on someone remembering to rerun a suite and update a cell by hand, that's the actual gap, and it's the same gap Autonoma was built to close on the behavioral half of this list: the smoke, sanity, regression, system, and acceptance-execution rows that can report their own status the moment a change lands, instead of waiting for someone to notice.

Frequently Asked Questions

Twelve gates, at minimum: a green smoke run on the candidate, a sanity pass on whatever changed, a regression suite that's green or explicitly triaged, a system test pass against the spec, integration or contract checks, a signed acceptance review, non-functional thresholds like load and accessibility, an operational acceptance review covering runbooks and monitoring, a tested rollback, a known feature-flag state, a clean data migration dry run, and a recorded go or no-go decision. Each row needs an owner and a concrete, checkable pass condition, not just a name and a blank checkbox.

A waived row is a Pass a person accepted despite a known gap, with a documented reason and a name attached to that decision, the way a regression row can be waived for pre-existing, ticketed failures unrelated to the current release. A blocked row stops the release outright and needs either a fix or an explicit waiver before the candidate can move again. Waived rows still let a release ship; a single blocked row does not, no matter how many other rows are green.

Keep the gate names and the owner column, and delete the status column before you reuse it. Then replace every pass condition with one that is checkable against your own systems: a named CI job rather than 'smoke green', a specific contract broker rather than 'integration checks', a numeric latency and accessibility threshold rather than 'non-functional'. A sign-off template is only useful if each row names the artifact that proves it, so add an evidence column with a link target for every row before the first release runs through it. Rows nobody can point at an artifact for are the rows that will be typed in from memory.

Entry and exit criteria define when it's valid to start or stop a specific test phase, like when a system test cycle is allowed to begin and when it's considered complete. A release readiness checklist sits one level up: it's the set of gates a candidate has to clear across every phase, smoke through go/no-go, before it ships. In practice the exit criteria for each phase usually become the pass condition for that phase's row on the checklist.

It signs the rows a machine should sign, which is most of them. Autonoma generates and runs the behavioral, execution-driven checks, smoke, sanity, regression, system, and acceptance execution, against a live preview of the build, and the Diffs Agent keeps that suite current as the codebase changes, so those rows publish their own status instead of waiting on someone to retest and retype a cell. The remaining rows, non-functional thresholds, the rollback drill, and the acceptance, waiver, and go/no-go judgment calls, stay with the specialists and the names who own them, which is what keeps the checklist trustworthy. Autonoma turns the mechanical majority into a live signal so your team's attention goes to the few rows that genuinely need a human.

Yes, and it is the most common way a checklist misleads. If the checklist is a document someone fills in by hand, the cell reflects whatever was true when it was last checked, not what's true now. A regression suite can turn up a new failure, a load number can regress, or a rollback that worked last week can fail against this week's schema, all without anyone updating the cell. The fix isn't checking more often, it's having each gate publish its own status automatically so the checklist becomes a live query instead of a snapshot.

Related articles

An isometric charcoal diorama of a long row of small stone archway gates receding past the frame, each feeding a thin lime conduit into one lit control panel. Two conduits leave the panel: one runs through a wide open gate with no operator, the other bends to a narrow side gate where a lone figure inspects a single card

What Is the Release Management Process? 10 Gates to Go/No-Go

The release management process, stage by stage: what evidence each gate produces, who owns the go/no-go decision, and when it actually becomes a meeting.

Testing in production: an orderly lime-lit staging room opens through a gate into a larger, darker landscape of scattered irregular production nodes

Why Testing in Production Beats Staging Alone

Testing in production means checking live traffic on purpose. The four things staging can't fake, the practices that do it safely, and where the line sits.

Isometric dark scene where five lime-lit rails carrying cargo sleds merge into a single track through one gate, with Quara waiting just beyond it.

What Is Acceptance Testing? 5 Types, One Gate

Acceptance testing has five types, not one. The complete map, who runs each, and why acceptance is the least automatable gate in the release pipeline.

Isometric scene of a wide dark stream of traffic cubes flowing past untouched while one thin lime lane peels off, passes through a lime scanning gate and rejoins downstream, watched by the Autonoma frog mascot at a diverter lever

Why Your Canary Testing Keeps Missing Real Bugs

Canary testing fails silently when thresholds sit below what the traffic can prove. The metric, threshold and sample-size math that fix it.