Upgrades and Rollback¶
An Atlas upgrade changes a named software and deployment release while preserving governed API behavior, published dataset access, telemetry, and explicit configuration semantics. Runtime rollback restores the supported previous software/deployment release. Dataset-pointer rollback and durable data recovery are different procedures.
Decide Which Plane Failed¶
| Symptom | Recovery plane | First authority |
|---|---|---|
| candidate image, chart, config, readiness, or request regression | runtime and deployment rollback | Helm release history, compatibility table, and candidate evidence. |
| wrong dataset promoted while immutable artifacts remain intact | dataset-pointer rollback | catalog history, manifest.lock, promotion rules, and dataset index. |
| missing or corrupt catalog/artifact bytes | backup and recovery | backup manifest, integrity evidence, and restore procedure. |
| incompatible client contract | stop promotion or restore compatible runtime | OpenAPI/API compatibility result and client support policy. |
Do not roll back immutable dataset artifacts because runtime code fails. Do not use Helm rollback as a substitute for restoring corrupt durable state.
Compatibility Directions¶
| Boundary | Forward question | Reverse question |
|---|---|---|
| API and clients | Can supported clients consume the candidate? | Do clients still work after runtime rollback? |
| configuration | Can the candidate read the selected configuration? | Can the previous runtime read state left by the candidate? |
| chart and values | Can the candidate render and become ready? | Can the previous chart and values be restored coherently? |
| catalog and artifacts | Can the candidate serve the published release? | Can the previous runtime serve the same selected release? |
| cache and transient state | Can entries be reused or rebuilt safely? | Can candidate-created entries be ignored or invalidated? |
| telemetry | Are candidate signals complete and attributable? | Can recovery be proven with previous-release signals? |
Forward compatibility permits rollout. Reverse compatibility permits routine rollback. A supported forward transition without a supported reverse path requires a different recovery plan and must be visible before traffic changes.
Bind Baseline and Candidate¶
Before changing traffic, record:
- source revision, product version, chart digest, and image digest for both baseline and candidate;
- exact values/profile identity and effective runtime configuration;
- published dataset IDs, catalog selection, and manifest-lock digests;
- supported transition row from the compatibility table;
- API and configuration migration results;
- readiness, correctness, telemetry, security, and load thresholds;
- immutable rollback artifacts and the operator decision deadline.
flowchart LR
Baseline[Verified baseline] --> Candidate[Deploy candidate]
Candidate --> Traffic[Prove candidate receives traffic]
Traffic --> Observe[Evaluate invariants and budgets]
Observe -->|pass| Promote[Promote and retain baseline]
Candidate -->|startup failure| Rollback[Restore supported previous release]
Observe -->|regression| Rollback
Rollback --> Verify[Verify identity, traffic, correctness, and cleanup]
Verify -->|pass| Restored[Restored baseline]
Verify -->|fail| Incident[Enter incident or data recovery]
Readiness without traffic is not candidate validation. Aggregate metrics without release labels can hide a failed candidate behind healthy baseline replicas.
Record Candidate State Changes¶
Before traffic begins, create a ledger of every boundary the candidate may change. Update it from observed actions during rollout. The ledger decides whether controller rollback is sufficient or another recovery plane is needed.
| Boundary | Reverse-path requirement |
|---|---|
| Kubernetes objects. | Previous objects render coherently, regain ownership, and leave no candidate-only resource active. |
| runtime configuration. | Previous parser accepts the effective values and Secret references after candidate removal. |
| credentials and trust. | Overlap material remains valid until previous replicas serve traffic; revocation is separately gated. |
| cache entries. | Keys are version-compatible or the candidate namespace can be discarded without store overload. |
| catalog pointer. | The previous runtime supports the selected pointer, or an explicit dataset-pointer decision is recorded. |
| immutable artifacts. | Candidate use creates no mutation; any integrity concern enters durable-data recovery. |
| policy and telemetry. | Previous release regains required admission, audit, metric, log, and trace coverage. |
For each touched boundary, retain the before identity, candidate identity, rollback action, and restored identity. An unplanned shared-state mutation stops routine promotion even when request metrics remain within budget.
Repository Planning Checks¶
The repository contains hidden release-planning helpers. They are useful for inspecting checked-in policy, but they are not deployment execution or release proof.
bijux-atlas-dev release compatibility-check \
--from-version 0.2.0 \
--to-version 0.1.1 \
--format json
bijux-atlas-dev release rollback-plan \
--from-version 0.2.0 \
--to-version 0.1.1 \
--format json
Run compatibility checking separately. The current rollback-plan implementation
returns a plan with status: ok without verifying that the supplied version
pair exists in the compatibility table. It also loads the
rollback-after-successful-upgrade step list regardless of the supplied pair.
Never interpret plan status as transition support.
Simulation Boundary¶
ops helm upgrade and ops helm rollback currently target the kind simulation
path. Rollback supports only --to previous and requires subprocess, write, and
network capability grants. It does not constitute a production-cluster
rollback interface.
bijux dev atlas ops helm rollback \
--cluster kind \
--profile kind \
--to previous \
--allow-subprocess \
--allow-write \
--allow-network \
--evidence \
--format json
Use a unique run ID and artifact root for an executed rehearsal. Retain the command output together with Helm history, Kubernetes rollout state, request checks, release-labeled telemetry, and cleanup inspection.
Dataset-Pointer Rollback¶
The governed dataset rollback strategy is manifest-lock-pointer:
- select a previous dataset ID;
- validate its
manifest.lockintegrity; - publish the previous pointer without mutating old artifacts.
The policy permits a maximum depth of three and requires the manifest lock, promotion rules, and dataset index. Exceeding that boundary is not a deeper runtime rollback; it requires an explicit recovery decision.
Current Evidence Limits¶
The compatibility matrix supports adjacent transitions: 0.1.0 to 0.1.1,
0.1.1 to 0.2.0, and their reverse rollback paths. Both checked-in rollback
scenario files declare 0.2.0 to 0.1.0, which is absent from the matrix.
The OCI transition evidence is marked simulated and uses repeated-digit chart
and image digests. The installation evidence bundle is marked placeholder.
The rollback report schema requires only profile, cluster, namespace, and
status; it does not require release identity, request correctness, traffic,
timings, telemetry, or cleanup proof. These assets are specifications and
fixtures, not evidence of a completed supported transition.
Acceptance¶
Promote only when the candidate receives governed traffic and all declared compatibility, migration, dataset, correctness, readiness, telemetry, security, and load checks pass. Accept rollback only when the supported previous release identity is restored, serves traffic, returns correct results, preserves the selected dataset, and leaves no candidate-owned partial state.
Preserve the first violated signal and every recovery action. If the previous release cannot recover or shared state is damaged, stop cycling releases and enter Backup and Recovery. Use Rollback Drills to build the missing execution evidence.
An aborted rollout is not automatically a successful rollback. Record whether the candidate changed shared configuration, catalog pointers, caches, or other state before it was removed. Verify each touched boundary against the restored release rather than relying only on controller status.