Responsible release operations
A canary is not a rollout decision
Bound initial exposure without confusing an available workload, requested traffic, or passing analysis with a safe rollout outcome.
Research boundary and source notes
Use these sources narrowly:
- Kubernetes documents Deployment rollout mechanics and status. Its Deployment guide describes rolling updates, ReplicaSets,
maxUnavailable,maxSurge, rollout status, progress deadlines, and rollback to an earlier revision. This supports recording desired and observed workload revisions, availability, and controller progress as separate rollout evidence. It does not prove that traffic reached versions in an intended ratio, that a protected user task succeeded, or that durable effects are compatible and reconciled. - Argo Rollouts documents canary strategy controls. Its canary guide describes step-based rollout behavior including traffic weight and pauses, and distinguishes replica-weighted canaries from finer traffic management integrations. This supports treating desired weight, actual replica state, routed traffic, pauses, and analysis as separate observations. It does not choose a safe metric, representative population, evaluation horizon, or business decision for a particular system.
- Google's Site Reliability Engineering Workbook describes canarying releases as a partial, time-limited deployment evaluated before wider rollout. Its canarying chapter discusses selecting a canary population, evaluating canary and control groups with meaningful metrics, and balancing speed, safety, and confidence. This supports explicit population, comparison, metric, and decision design. It does not prescribe one universal sample size, threshold, exposure percentage, analysis method, or promotion rule.
All three source URLs returned HTTPS 200 during research on 2026-08-16:
- Kubernetes, Deployments
- Argo Rollouts, Canary Deployments
- Google SRE Workbook, Canarying Releases
The deployed controller, router, service mesh, analysis engine, telemetry model, release policy, data contracts, dependency contracts, and incident procedures remain controlling. The contract, states, example, ordering rules, and tests below are Alfred's proposed method.
Core thesis
A canary bounds initial exposure. A rollout decision also requires comparable populations, trustworthy task evidence, matured effects, an explicit decision rule, and an authorized safe action.
Keep these claims separate:
- Revision accepted: one control plane accepted a desired workload or rollout specification.
- Canary available: the controller reports the declared canary workload as available.
- Weight requested: the rollout specification requests one traffic or replica proportion.
- Weight observed: routing and request evidence supports the actual version distribution for a declared scope and window.
- Population comparable: canary and control traffic are comparable for the decision or differences are modeled explicitly.
- Signal current: required observations are complete enough and fresh enough for the decision horizon.
- Task outcome measured: the protected user task has a defined numerator, denominator, terminal state, and coverage boundary.
- Effects matured: delayed failures, asynchronous work, and durable destination effects reached the contract's observation horizon.
- Decision rule passed: the exact versioned promotion, hold, rollback, or abort rule returned one result.
- Action authorized: the current release authority can safely execute the selected response.
- Action completed: controller, routing, work, data, dependencies, and effects reached the intended terminal state.
- Rollout outcome verified: the protected task and authoritative effects satisfy the exact scope after the action.
A healthy Pod, available ReplicaSet, requested weight, green dashboard, completed pause, passing analysis run, or quiet error graph proves only one layer.
Work one canary through the hard case
Consider an illustrative checkout release:
release_id = checkout-summary-v3
control_revision = v2
canary_revision = v3
protected_task = submit a valid order and receive one durable order
initial_target = 5 percent eligible traffic
analysis_window = 20 minutes after minimum evidence
candidate_action = promote | hold | abort
These names and values are placeholders. They do not refer to a real system, release, customer, threshold, or result.
The controller creates the canary workload, all declared instances become available, the router receives a five-percent target, and a dashboard shows similar request-error rates for control and canary. A timed pause ends. That apparently healthy sequence can hide materially different situations:
- sticky sessions keep returning accounts on the control revision, so the canary receives mostly first-time or unauthenticated traffic;
- a region or mobile client that exercises the changed request shape is absent from the canary route;
- replica proportion is mistaken for request proportion even though load is uneven;
- retries are counted as independent attempts and make the canary population look larger;
- control traffic is served from warm caches while canary traffic performs cold dependency calls;
- the canary writes a new order state that the control revision cannot read after rollback;
- successful responses arrive before asynchronous reservation work reaches a terminal effect;
- low volume produces no errors but also too little evidence for the declared decision;
- a shared dependency degrades both groups, hiding a canary-specific regression in a broad aggregate;
- a route label changes during rollout and splits one logical metric stream;
- the analysis query excludes timeouts or zero-traffic series;
- a completed pause advances the rollout even though required evidence is stale;
- an abort changes desired routing while admitted jobs and destination effects remain unresolved.
A safer canary freezes the release identity, protected task, eligible population, comparison design, effect horizon, and decision rule before exposure. It records requested and observed routing separately, identifies every admitted operation by revision and stable operation identity, tests data and message compatibility, waits for delayed effects, preserves missing and conflicting evidence, and binds each possible result to a bounded authorized action.
Define a canary-decision contract
release_id: stable identity for code, configuration, schema, and dependency set
control_identity: exact baseline revision and relevant runtime configuration
canary_identity: exact candidate revision and relevant runtime configuration
eligibility: populations, routes, regions, clients, identities, and exclusions
assignment: random, deterministic, sticky, request-level, session-level, or entity-level
routing_authority: component that sets and observes effective traffic distribution
weight_plan: requested steps, pauses, minimum dwell, and maximum exposure
operation_identity: stable identity binding retries and durable effects to one intent
protected_tasks: exact user tasks, terminal states, and severity classes
comparison: control selection, contamination rules, stratification, and shared-failure handling
signals: metric identity, numerator, denominator, unit, coverage, and freshness
minimum_evidence: volume and horizon required before each decision is eligible
late_effects: asynchronous, delayed, retry, cancellation, and reconciliation horizon
data_contract: read, write, rollback, and mixed-version compatibility
stop_conditions: fast safety boundaries independent of ordinary analysis windows
decision_rule: promote, hold, rollback, abort, or indeterminate logic and revision
authority: current role permitted to select and execute each action
recovery: routing, workload, in-flight, data, dependency, and effect completion rule
privacy: allowed dimensions, evidence minimization, access, and retention
terminal_outcomes: promoted_scoped, held, aborted_scoped, blocked, conflicted, unknown
Before exposure, answer:
- Which exact user task and durable effect is the canary intended to protect?
- Which code, configuration, schema, feature state, and dependency versions define control and canary?
- Who or what is eligible, excluded, or forced into either group?
- Is assignment per request, session, account, entity, region, or another stable unit?
- Can retries, redirects, asynchronous work, or returning sessions cross versions?
- Which authority can establish requested routing, and which observation can establish effective routing?
- Does replica weight approximate request weight under the actual load distribution?
- Are control and canary comparable by region, client, identity class, route, data state, cache warmth, and dependency path?
- Which shared failures could move both groups and hide a candidate-specific defect?
- How are absent, zero, stale, delayed, duplicated, partial, and conflicting data represented?
- What minimum evidence and maturity horizon is required before ordinary promotion is eligible?
- Which severe symptom must stop exposure without waiting for ordinary statistical confidence?
- Can either revision read and preserve every representation reachable during hold, promotion, or abort?
- Which admitted jobs, messages, writes, or external effects can outlive a routing change?
- What does each decision result authorize, and what additional recovery work must follow?
- Which release, routing, signal, population, or dependency change invalidates prior analysis?
Match evidence to its authority
| Authority | Observation | Narrow conclusion | Evidence still missing |
|---|---|---|---|
| Deployment controller | Desired and observed revision, replica, availability, and progress state | The workload controller reached one declared rollout state | Effective routing, representative demand, task outcome, and durable effects |
| Traffic authority | Configured route weight and active route revision | One router accepted a desired distribution | Actual request assignment, bypass routes, retries, and downstream work |
| Request telemetry | Version-tagged eligible requests for a scoped window | Observed request distribution and client-visible response states exist | Population comparability, missing paths, and durable completion |
| Assignment ledger | Stable subject or operation identity maps to one revision | Declared assignment and contamination can be evaluated | Whether the assigned path actually executed and completed |
| Analysis engine | One versioned query and rule returned pass, fail, or inconclusive | The configured analysis reached one result | Semantic correctness, authority, delayed effects, and safe action |
| Data authority | Reachable records pass mixed-version read and write fixtures | Declared data states are compatible for tested paths | Uncovered states, live workload behavior, and external effects |
| Destination authority | Stable operation identities have terminal effect states | Scoped effects committed, failed, duplicated, or remain uncertain | User-visible convergence and continued recovery horizon |
| Release authority | A current role selected an allowed response under one contract revision | One decision is authorized | Whether routing, workloads, work, data, and effects complete it |
Conflicts remain visible. controller_available + traffic_unobserved, analysis_passed + population_skewed, response_healthy + effects_pending, or abort_requested + jobs_active cannot be averaged into a successful rollout.
Proposed evidence states
- Intent frozen: release identity, protected task, population, horizon, rule, and actions are explicit.
- Revision uncertain: code, configuration, schema, dependency, or route identity is incomplete.
- Canary available: the declared candidate workload is available under controller semantics.
- Routing requested: one exact canary weight or route rule was accepted.
- Routing observed: eligible requests support one effective distribution for exact scope and time.
- Routing drifted: requested and observed distributions disagree beyond the contract boundary.
- Population skewed: control and canary differ on a decision-relevant dimension.
- Control contaminated: operations or subjects cross revisions contrary to the comparison design.
- Evidence insufficient: volume or horizon is below the declared minimum.
- Evidence stale: required observations are outside the current decision window.
- Evidence partial: one required route, region, client, state, or failure path is absent.
- Evidence conflicted: trusted controller, router, request, analysis, data, or effect observations disagree.
- Fast stop triggered: a declared severe boundary requires exposure containment.
- Analysis passed: one exact versioned ordinary decision rule passed.
- Analysis failed: one exact versioned ordinary decision rule failed.
- Analysis inconclusive: the rule cannot safely select promotion or abort.
- Effects pending: required delayed or durable outcomes have not matured.
- Effects reconciled: admitted operations have known destination states through the horizon.
- Action blocked: the selected action lacks authority, compatibility, or a safe execution path.
- Promotion active: exposure is increasing under the versioned plan.
- Abort active: new exposure is being contained while prior work and effects remain open.
- Promoted scoped: routing, workload, data, dependencies, effects, and user-path evidence meet the exact completion rule.
- Aborted scoped: new exposure stopped and admitted work, data, dependencies, and effects meet the exact abort rule.
Do not collapse canary available, routing observed, population comparable, analysis passed, effects reconciled, action completed, and rollout outcome verified.
Proposed decision order
1. Freeze release identities, protected task, eligible population, decision horizon, and authority.
2. Define control and canary code, configuration, schema, feature, route, and dependency identity.
3. Define assignment unit, stickiness, retry behavior, contamination rules, and exclusions.
4. Inventory controller, router, bypass routes, workers, queues, stores, and effect authorities.
5. Prove mixed-version read, write, message, cache, and dependency compatibility with fixtures.
6. Define requested weight separately from observed eligible request distribution.
7. Define task indicators, terminal states, coverage, freshness, and missing-data behavior.
8. Choose comparison strata and handling for shared failures and population imbalance.
9. Freeze minimum evidence, maturity horizon, ordinary rule, and severe fast-stop rule.
10. Bind every request and admitted operation to release and stable operation identity.
11. Start the smallest exposure that can produce useful evidence without exceeding the risk bound.
12. Verify workload identity, route identity, effective assignment, and required population coverage.
13. Preserve partial, stale, skewed, contaminated, and conflicting evidence as blockers.
14. Wait for asynchronous and delayed effects through the declared maturity horizon.
15. Evaluate the exact versioned rule without treating a pause expiry as a pass.
16. Select promote, hold, abort, or indeterminate under current authority.
17. During promotion, continue evidence checks at every exposure step rather than reusing the first pass.
18. During abort, stop new admission and reconcile queued, claimed, written, and external effects.
19. Verify routing, workload, data, dependency, effect, and user-path terminal state.
20. Report the exact scope, horizon, exclusions, unresolved evidence, and decision revision.
Failure-shaped test matrix
| Failure-shaped test | Expected result | Advancement rule |
|---|---|---|
| Five percent of replicas receive one percent of eligible requests. | routing_drifted |
Use observed eligible request distribution; do not infer exposure from replica count. |
| Sticky assignment sends mostly new accounts to the canary. | population_skewed |
Stratify or redesign assignment before comparing task outcomes. |
| A retry crosses from canary to control and creates two attempts. | control_contaminated |
Bind retries to stable operation and assignment identity before analysis. |
| The canary receives no traffic in one required region. | evidence_partial |
Restore or explicitly exclude that scope; zero observations are not healthy results. |
| Both groups degrade after a shared dependency failure. | shared_failure_active |
Preserve the shared incident; do not call the candidate safe from a small difference. |
| A route-label rename splits canary data midway through the window. | evidence_conflicted |
Reconcile stream identity and restart or version the analysis horizon. |
| The ordinary rule passes before asynchronous effects mature. | analysis_passed + effects_pending |
Hold until the declared destination-effect horizon is reconciled. |
| One severe data-corruption fixture fires at low volume. | fast_stop_triggered |
Contain exposure under the independent safety rule; do not wait for ordinary volume. |
| A pause expires while the analysis source is stale. | evidence_stale |
Hold; elapsed time is not a promotion decision. |
| The canary writes a state the control revision cannot preserve. | action_blocked |
Use forward repair or a compatibility bridge; do not perform a destructive rollback. |
| Abort sets weight to zero while canary jobs remain claimed. | abort_active + effects_pending |
Fence or reconcile admitted work before claiming aborted completion. |
| A dashboard aggregates routes with different error semantics. | indicator_undefined |
Align terminal states and denominators before evaluating a combined rate. |
| Promotion begins under one rule revision and finishes under another. | decision_revision_conflict |
Freeze or explicitly restart the decision under the new contract. |
| A cohort dimension contains a direct personal identifier. | evidence_policy_failed |
Remove the dimension and rebuild privacy-minimized assignment evidence. |
Read one exposure as a timeline, not a green step
The illustrative five-percent target becomes useful only when its observations remain attached to time, scope, and authority. One synthetic window might look like this:
| Time | Observation | Narrow state and decision |
|---|---|---|
| 10:00 | The release authority freezes v2, v3, eligible routes, the protected order task, the rule revision, and a five-percent maximum initial target. |
intent_frozen; no exposure has been proved. |
| 10:02 | The controller reports all declared canary instances available. | canary_available; effective routing and task evidence remain unknown. |
| 10:04 | The router accepts a five-percent rule, but request telemetry shows two percent of eligible requests reaching v3. |
routing_requested + routing_drifted; do not start the analysis clock from the desired weight. |
| 10:07 | Routing is corrected. Observed exposure is near the target, but the canary contains mostly first-time sessions and no required mobile-client traffic. | population_skewed + evidence_partial; hold rather than compare the aggregate rates. |
| 10:12 | Required strata are now represented, stable operation identities bind retries, and no fast-stop fixture has fired. | The minimum-evidence clock may begin under this exact comparison design. |
| 10:22 | The ordinary rule passes for current response outcomes, but reservation work admitted by v3 has not reached its declared destination horizon. |
analysis_passed + effects_pending; passing analysis does not authorize promotion yet. |
| 10:27 | One reservation fails after the response and its operation remains safe to retry, while the rule's bounded practical limit is crossed in the affected stratum. | analysis_failed; select hold or abort according to the frozen rule, not according to dashboard color. |
| 10:29 | New v3 admission is set to zero. Two already-claimed jobs still run. |
abort_active + effects_pending; zero desired weight is not aborted completion. |
| 10:35 | Claimed jobs reach known terminal effects, mixed-version reads pass for reachable records, routing evidence shows no new v3 admission, and the protected task is checked for the declared scope. |
aborted_scoped; record exclusions and horizon without claiming a universal rollback result. |
The times, weights, task, cohorts, and outcomes are synthetic. They demonstrate ordering only. A real contract must derive its exposure bound, minimum evidence, practical limits, and maturity horizon from the system's risks and controlling policy.
Make the comparison answer the rollout question
A canary comparison is not made representative by adding a control line to a chart. Before evaluating a difference, record the assignment unit and compare the groups on decision-relevant dimensions such as route, region, client version, authentication state, cache state, dependency path, and pre-existing data shape. Use only privacy-minimized dimensions authorized for that purpose.
If those dimensions change the protected task's behavior, either design assignment so the groups remain comparable or evaluate declared strata separately. An overall rate can reverse or hide a change when group proportions differ. A stratum with no canary observations is missing coverage, not a zero-error result. If subjects or operations cross revisions, preserve the contamination rather than pretending the groups remained independent.
The requested split should also be checked against observed assignment. A material mismatch between expected and observed group proportions can signal routing, eligibility, logging, stickiness, or identity defects. The contract must define which mismatch blocks analysis; this note does not supply a universal tolerance or test. First reconcile the population-producing mechanism, because a precise calculation over the wrong population does not answer the rollout question.
Repeated evaluation needs an explicit rule too. Looking after every request and promoting at the first favorable result changes the decision process from the one originally described. Freeze when evaluation is allowed, what evidence is reusable between weight steps, which severe condition stops immediately, and which ordinary decision waits for its declared horizon. If the population, query, threshold, assignment, route, release identity, or dependency set changes, version or restart the affected analysis rather than silently carrying forward a pass.
Finally, distinguish a measurable difference from one that changes the operational decision. A very small difference can be estimated precisely yet remain inside a predeclared practical boundary; a severe outcome can require containment even when ordinary volume is low. The practical boundary, uncertainty method, minimum evidence, and fast-stop rule must be selected before exposure from the protected task and risk policy. No sample size, significance threshold, confidence level, effect limit, or traffic percentage in this illustrative note is a default for a real rollout.
Keep rollout evidence on separate clocks
Different evidence exists for different decisions and should not inherit one blanket retention setting:
- Exposure horizon: preserve privacy-minimized release, route, assignment, eligibility, and observed-distribution evidence long enough to reconstruct who or what could have reached each revision through every weight step and routing correction.
- Analysis horizon: preserve the rule revision, query identity, strata, coverage, freshness, minimum-evidence result, evaluation times, and decision outputs long enough to explain each hold, promotion, or abort. A changed comparison contract invalidates reuse even if old records still exist.
- Effect horizon: preserve the smallest authoritative operation references needed to reconcile delayed jobs, messages, writes, retries, cancellations, and external effects through their supported ambiguity and recovery windows. Routing a canary to zero does not shorten this horizon.
- Recovery horizon: preserve action, fencing, workload, compatibility, repair, route, and terminal user-path evidence until the selected response's exact completion rule can be evaluated and disputed observations are resolved.
- Tuning horizon: preserve false-positive, false-negative, population-skew, routing-drift, and practical-boundary evidence only while release mechanics, task semantics, assignment, telemetry, dependencies, and policy remain comparable.
Retention is evidence preservation, not permission to keep direct identifiers or payloads. Minimize dimensions, separate access by purpose, apply the controlling privacy and deletion policy, and record when deletion narrows what later claims can establish. Existing evidence can also become stale immediately after a relevant contract change even when its storage period has not expired.
A compact canary-decision evidence card
Return evidence-shaped rollout outcomes
| Result | Meaning | Required handling |
|---|---|---|
rollout_blocked |
Release identity, protected task, compatibility, authority, recovery path, or another prerequisite is missing before exposure. | Do not start merely because the controller accepts a canary specification; name the missing contract field. |
evidence_inconclusive |
Volume, horizon, coverage, comparability, freshness, or effect maturity cannot support promotion or abort under the current rule. | Hold the bounded exposure or reduce it if the contract requires; gather only the missing authorized evidence. |
evidence_conflicted |
Trusted controller, routing, assignment, request, analysis, data, or effect observations disagree. | Preserve each observation and reconcile the disputed fact at its controlling authority instead of averaging to green. |
hold_scoped |
The contract authorizes no wider exposure while current evidence remains bounded and recoverable. | Freeze the declared exposure, continue fast-stop checks, and set an expiry or next decision condition. |
promotion_authorized |
Current, comparable, mature evidence passes one exact rule and the current authority selects the next bounded weight step. | Record the rule and authority; this is permission to act, not proof that the action completed. |
promotion_active |
Routing or workload exposure is changing toward the next declared step. | Re-establish effective routing, population coverage, and task evidence at the new scope; do not reuse the prior step's conclusion automatically. |
abort_authorized |
A fast-stop or ordinary rule selects containment under current authority. | Stop new exposure through the declared mechanism and begin reconciliation; authorization is not completion. |
abort_active |
New exposure is being contained while admitted work, data, dependencies, or effects remain open. | Track every completion layer and use compatible repair rather than a destructive rollback. |
action_blocked |
A selected promotion or abort lacks safe authority, compatibility, or an executable recovery path. | Escalate within the declared boundary and preserve exposure; do not improvise an unsafe action to obtain a terminal label. |
promoted_scoped |
Routing, workloads, task evidence, data, dependencies, and effects meet the versioned promotion-completion rule for exact scope and horizon. | Record exclusions and continue only under the next independently evaluated step or final observation contract. |
aborted_scoped |
New candidate exposure stopped and admitted work, data, dependencies, and effects meet the versioned abort-completion rule. | Record residual exclusions and repairs without claiming the candidate left no impact outside the proved scope. |
outcome_unknown |
Required evidence was lost, invalidated, or cannot be reconciled. | Preserve uncertainty, choose the safest authorized exposure state, and do not relabel absence as success. |
These results may coexist across layers: promotion_authorized + routing_drifted, analysis_passed + effects_pending, and abort_active + outcome_unknown are more accurate than one rollout status. A later record supersedes an earlier one only when release identity, rule revision, task, population, scope, horizon, and authority align.
Compact canary-decision checklist
Use this before initial exposure and repeat the applicable checks at every weight step:
- Freeze code, configuration, schema, feature, route, and dependency identities for control and canary.
- Name the protected task, terminal user outcome, durable effect, eligible population, exclusions, and maximum exposure.
- Define assignment unit, stickiness, retry behavior, stable operation identity, and contamination rules.
- Separate controller availability, requested weight, active route revision, and observed eligible request distribution.
- Inventory bypass routes, workers, queues, stores, caches, messages, external effects, and their controlling authorities.
- Fixture-test mixed-version reads, writes, messages, caches, rollback paths, and dependency contracts before exposure.
- Declare comparison strata and check observed group proportions, absent cohorts, shared failures, and population skew.
- Define task numerators, denominators, terminal states, units, coverage, freshness, late data, and missing-data behavior.
- Freeze minimum evidence, evaluation timing, practical boundary, repeated-look rule, and independent severe fast-stop conditions.
- Bind every admitted request and operation to exact release, assignment, and effect identity without exposing personal identifiers.
- Start only the smallest authorized exposure that can answer the declared question inside the risk bound.
- At each step, verify effective routing and required population coverage before starting or continuing analysis.
- Treat stale, partial, skewed, contaminated, below-minimum, and conflicting evidence as explicit blockers.
- Wait for asynchronous, retry, cancellation, and destination effects through the declared maturity horizon.
- Evaluate the exact frozen rule; do not treat workload availability, a quiet graph, or pause expiry as a pass.
- Record whether the result is block, hold, promote, abort, inconclusive, conflicted, or unknown and who has authority.
- Re-evaluate evidence after every exposure change; do not carry a narrow pass into a broader population automatically.
- During abort, stop new admission and reconcile claimed work, reachable data, dependency state, and external effects.
- Give exposure, analysis, effect, recovery, and tuning evidence separate minimization, access, invalidation, and retention rules.
- Report exact release, rule revision, scope, horizon, exclusions, unresolved evidence, selected action, and verified terminal state.
Working takeaway
Do not promote because a canary workload is available, a traffic weight was accepted, a pause elapsed, or one dashboard stayed green. Freeze the protected task, eligible population, assignment rule, comparison, effect horizon, decision rule, and action authority. Then prove effective routing, comparable evidence, mature effects, mixed-version compatibility, and a safe terminal action. Until those layers agree, report the narrow state—routing drifted, population skewed, evidence insufficient, analysis inconclusive, effects pending, promotion active, or abort active—not “the rollout succeeded.”