rollback-revision
Roll back by moving one or more Unit heads to bound prior revisions via cub unit update --restore, then hand off to release-publish. Use for "roll back this change", "revert the last release", "undo the ChangeSet", or "restore to the last applied revision". Not for a clearer one-field forward fix.
Works with
--- name: rollback-revision description: Roll back by moving one or more Unit heads to bound prior revisions via cub unit update --restore, then hand off to release-publish. Use for "roll back this change", "revert the last release", "undo the ChangeSet", or "restore to the last applied revision". Not for a clearer one-field forward fix. license: MIT --- # rollback-revision **Execution mode:** follow [`references/execution-modes.md`](../../references/execution-modes.md). This Skill grants no automatic tool permission. After binding and diffing the exact restore target, standalone use submits one requested head-moving restore to the host permission system. The later whole-Space publication is a separate host-permission call; an external overlay may stop either step before Bash. Resolve and preview the exact Unit head or ChangeSet scope to restore. On a clear standalone rollback request, submit one exact restore through the host permission system, verify it, and treat the later whole-Space publication as a separate request. ## `cub unit update --restore` is the only rollback mechanism Rollback always means: create a new head whose data equals a bound prior Revision, then publish that restored desired state through a newly approved Space Release. Every subsequent mutation branches from the restored head, so the bad state stays gone. Rollback is a head-moving `cub unit update --restore` followed, after verification, by a separate immutable Space Release. Each is its own host-permission call. Do not try to replay historical runtime data without moving head: the next mutation or promotion would re-introduce the bad state. Recognize and refuse the `retired-unit-runtime-verbs` anti-pattern retained in `compatibility/no-loss-inventory.v1.json`; the active skill deliberately does not reproduce its executable spelling. That historical bridge-era form could deploy old bytes without moving head, so it is **not rollback**. The current OCI Release profile has no per-Unit apply fallback. The durable route is to resolve the requested prior revision to RevisionID/DataHash, create a new head with `cub unit update --restore 47`, and then prepare a fresh Space Release. ## When to use - User says "roll back", "revert", "undo" — and means it: the restored state should be the new baseline. - Post-promotion rollback: a ChangeSet went out, the destination env rejects it, restore every affected Unit to `Before:ChangeSet:<slug>`. - Single-Unit revert: one Unit got a bad revision, restore to `LastAppliedRevisionNum` or a specific prior number. ## Do not load for - Fixing a single wrong field when the forward mutation is obviously cleaner (a `cub-mutate` run with `set-container-image` back to the old tag). Restore is heavier than a one-line change. - Reversing a change that has not been captured by publication and has not been proven at runtime — use a forward `cub-mutate` or restore to the revision before the bad one; do not claim anything about what is live from Unit metadata alone. ## Preflight gates 1. `cub auth status` succeeds — it contacts the server's `/me` endpoint to confirm the token is still valid (not just local login state). If it fails, ask the user to run `cub auth login` (an interactive browser sign-in an agent cannot complete). User has write permission on the target Space(s). 2. The rollback scope is explicit: single Unit slug, or a Filter (usually the `<app>-home/<app>-app` Filter from the promotion that's being rolled back) + optional `--where` narrowing. 3. The rollback target is explicit. Installed `--restore` selectors include: - Absolute revision number (`--restore 42`). **Note `--restore 1` restores *empty*:** every Unit now begins with an empty start revision and its created content lands on Revision 2. Units created before that change kept content on Revision 1, so read `cub revision list` rather than assuming which meaning applies. - Relative (`--restore -1` = one before head). - `LastAppliedRevisionNum` — the Revision most recently captured by ConfigHub publication bookkeeping; not proof of controller consumption or current runtime state. - `LiveRevisionNum` — retained bridge-era state only; not current OCI/controller/runtime proof. - `Tag:<home-space>/<tag>` — a named release marker. - `ChangeSet:<home-space>/<slug>` — the end of a ChangeSet. - `Before:ChangeSet:<home-space>/<slug>` — the ChangeSet's start tag, i.e. the head each Unit had immediately before the ChangeSet opened (the standard "undo release X" target). The start tag marks a revision that already existed rather than one manufactured by attaching, so a Unit that joined the ChangeSet and never changed rewinds cleanly along with the rest. - A revision UUID. Treat relative, `LiveRevisionNum`, and `LastAppliedRevisionNum` forms only as resolution aids: read what each resolves to and bind the exact RevisionNum, RevisionID, and DataHash before approval. 4. The destination currently isn't in the middle of *another* open ChangeSet on the same Units. 5. User has confirmed the exact resolved revisions and understands that the later Release may include additional Units. ## Pick the right target ```text # Inspect history to pick a target. cub revision list <unit> --space <space> # For a bulk rollback scoped to a ChangeSet, list the ChangeSet's revisions: cub revision list --space <space> --filter <app>-home/<app>-app \ --where "ChangeSet.Slug = '<changeset-slug>'" ``` Named targets (`Tag:` / `Before:ChangeSet:`) are useful resolution aids, but Tags and ChangeSet metadata are not immutable approval subjects. Resolve any selector now and bind the exact RevisionNum, RevisionID, and DataHash before review; re-resolve before any authorized execution. The last source-reviewed v0.2.11 Unit update path could transactionally compare caller-supplied `HeadRevisionNum` and `DataHash`/`ContentHash`. That older finding is not projected onto the installed v0.2.21 server. The stock v0.2.15 restore command does not expose those expected current-state fields. Re-read immediately before the call, name the race, and do not claim exact preview-to-execution binding. ## Shape A — single-Unit rollback ```bash cub unit update --space <space> <unit> \ --restore <target> \ --change-desc 'Rollback Unit to reviewed revision' ``` Then verify separately: ```bash cub unit diff <unit> --space <space> ``` After a successful restore, hand fresh state to `release-publish`. A single-Unit restore does not imply a single-Unit Release; `release-publish` must show the complete EffectiveReleaseSet and obtain a separate host permission for publication. Optionally tag the new head for future reference: ```bash cub tag create --space <home-space> rollback-<YYYYMMDD>-<unit> \ --annotation 'description=Record reviewed Unit rollback' ``` After verifying the Tag, attach it in a separate call: ```bash cub unit tag <home-space>/rollback-<YYYYMMDD>-<unit> --space <space> --unit <unit> ``` ## Shape B — ChangeSet rollback (standard post-promotion revert) This is the standard "undo a release" path, and it's one command per step thanks to the ChangeSet. **A promotion is nearly always Shape B, not Shape A.** An upgrade or `cub variant promote` walks its range and records **one downstream revision per upstream revision that had an effect** — so a single promotion produces many revisions per Unit, and different Units get different numbers of them. There is no revision number that means "just before the promotion" across the set, and `--restore -1` rewinds one hop of the walk rather than the promotion. If the promotion was wrapped in a ChangeSet, `Before:ChangeSet:` is the set-wise rollback target. If it was not, there is no set-wise undo: say so plainly, and reconstruct per Unit from `cub revision list` — the last revision before the first one carrying the promotion's change descriptions. Resolve the placeholders to literal values. Submit and verify the Tag first: ```bash cub tag create --space <app>-home rollback-<changeset-slug> --annotation 'description=Record reviewed ChangeSet rollback' ``` Then submit the restore as one separate call: ```bash cub unit update --patch --space <app>-<environment> \ --filter <app>-home/<app>-app \ --restore 'Before:ChangeSet:<app>-home/<changeset-slug>' \ --tag <app>-home/rollback-<changeset-slug> \ --change-desc 'Rollback reviewed ChangeSet for incident' ``` After verifying the restored heads, hand fresh state to `release-publish` for complete EffectiveReleaseSet disclosure and a separate publication decision. Each Unit head reverts to its pre-ChangeSet data. Current native approval can approve only the head at execution time and has no expected RevisionID/DataHash precondition, so it cannot prove that the revision reviewed earlier was the one approved. Neither native approval nor the restore publishes anything. The rollback Tag remains a retrieval marker. ## Shape C — rollback then reapply held-back changes (merge / rebase) If changes were made to the affected Units *after* the ChangeSet that you want to keep (e.g., urgent hotfixes applied after the bad release), a plain restore discards them. Use a 3-way merge instead (per `references/changesets.md`): ```bash cub unit update --patch --space <app>-<environment> \ --filter <app>-home/<app>-app \ --merge-source Self \ --merge-base 'Before:ChangeSet:<app>-home/<changeset-slug>' \ --merge-end 'ChangeSet:<app>-home/<changeset-slug>' \ --change-desc 'Merge reviewed changes onto rollback head' ``` This is an advanced path. Only reach for it when you've verified the hotfixes actually need preserving. ## Verify chain 1. `cub unit get <unit> --space <space> -o yaml` — Data matches the target revision's data. 2. `cub revision list <unit> --space <space>` — the new head revision has the rollback `--change-desc` (and Tag, for Shape B). 3. `release-publish` captures the restored heads in an exact new Space Release; `verify-apply` binds its ManifestDigest to controller/runtime proof. Legacy BridgeState/LiveRevision is not cluster proof for OCI delivery. 4. For Shape B: `cub revision list --space <app>-<environment> --filter <app>-home/<app>-app --tag <app>-home/rollback-<changeset-slug>` lists one restored revision per intended Unit. ## Tool boundary - Host permission: read-only Unit/revision/ChangeSet inspection; the pack preapproves no Bash call. - Standalone mutation steps: `cub unit update --restore`, tags, native approval, and the new Release are separate one-command host-permission calls. The restore has the pre-read race described above; `release-publish` owns exact publication scope. - Not allowed: historical runtime replay as a rollback, manually matching old data, or rolling back across applications in one scope. ## Stop conditions - The ChangeSet being rolled back is still *open*. Stop. Close it first (`cub unit update --patch --filter <f> --changeset -`) — you can't restore across an open ChangeSet without violating the lock. - Scope includes Units from multiple apps' `<app>-home`s. Split the rollback per app; one rollback per app. - User wants to delete the rolled-back revisions from history. Not possible, and not desirable — restore creates a new head; the "bad" revisions stay in the audit trail. - Rollback target is the Unit's current head (no-op). Tell the user and stop. - The promotion being rolled back was not wrapped in a ChangeSet. There is no set-wise restore target; confirm the per-Unit targets with the user before submitting a reconstructed scope. - The restore would rewind past protection or conflict state the user has not seen. Restore rewinds `MutationSources` — including each path's `Protected` flag — along with `Data`, so a restore also restores which paths the variant owned at that point. Read `cub unit get <unit> -o mutations` before and name the difference. ## Evidence - `cub space open <space> --print-url` — restored Space. - `cub unit open <unit> --space <space> --revisions --print-url` — restored head history. ## References - `references/changesets.md` — `Before:ChangeSet:<slug>` target, bulk restore pattern, 3-way merge for held-back changes. - `references/revisions.md` — current restore-target syntax (`Tag:`, `ChangeSet:`, relative / absolute numbers, UUIDs), the empty start revision, and how restore rewinds `MutationSources` with `Data`. - `references/filters-and-queries.md` — scoping the rollback via Filter. - `references/cub-cli.md` — `--change-desc` scope, `-` sentinel for `--changeset` close. - Companion skills: `release-publish` (post-restore whole-Space Release), `cub-mutate` (forward fix when clearer), `promote-release` (the forward counterpart), `verify-apply` (post-rollback checks).
More Deployment & CI/CD skills
azure-enterprise-infra-planner
microsoft/azure-skills
Architect and provision enterprise Azure infrastructure from workload descriptions. For cloud architects and platform engineers planning networking, identity, security, compliance, and multi-resource topologies with WAF alignment. Generates Bicep or Terraform directly (no azd). WHEN: 'plan Azure infrastructure', 'architect Azure landing zone', 'design hub-spoke network', 'plan multi-region DR topology', 'set up VNets firewalls and private endpoints', 'subscription-scope Bicep deployment', 'Azure Backup for VM workloads'. PREFER azure-prepare FOR app-centric workflows.
azure-kubernetes-app-deploy
microsoft/azure-skills
Use when deploying an existing web application or API to an already-running Azure Kubernetes Service cluster. Detects the framework, generates a Dockerfile and Kubernetes manifests, validates against AKS Deployment Safeguards, and deploys with verification. WHEN: deploy app to AKS, deploy to existing AKS cluster, containerize app for Kubernetes, generate K8s manifests for Azure, set up CI/CD for AKS, my AKS deployment is failing safeguard checks, I have a Django/Express/Spring Boot app to run on AKS. DO NOT USE FOR: creating or provisioning an AKS cluster (use azure-kubernetes), assessing migration to AKS Automatic (use azure-kubernetes-automatic-readiness), or deploying to non-AKS targets like Web Apps, Container Apps, or Functions.
finetuning
microsoft/azure-skills
Fine-tune models on Microsoft Foundry using SFT (supervised), DPO (preference), or RFT (reinforcement with graders). Covers dataset preparation, training job submission, deployment, and evaluation. USE FOR: fine-tune, SFT, DPO, RFT, training data, grader, distillation, fine-tuned model, training job, large file upload, calibrate grader, deploy fine-tuned model, evaluate fine-tuned model. DO NOT USE FOR: general model deployment without fine-tuning (use deploy-model), agent creation (use agents), prompt optimization without training (use prompt-optimizer).

