# Runbook: iOS hotfix iOS has no rollback. The levers, mildest first: - Page: - Updated: 2026-10-27 - Pinned copy of `Algorythmos-AI/gurbani-soul-ios` `docs/process/runbooks/ios-hotfix.md` at `a386422`; the canonical file is - From the Sri Guru Granth Sahib Ji — Knowledge Base wiki. Sri Guru Granth Sahib Ji is quoted verbatim, cited by Ang, and never altered. --- iOS has no rollback. The levers, mildest first: 1. **Pause the phased release** — stops new automatic updates; users who already updated keep the build. A pause has a time limit (check the current one in App Store Connect). Updates only: a first version has no phased release, so for it this lever does not exist — go to step 2. 2. **Ship a fixed build** (below), optionally asking for an **expedited review** through App Store Connect → Contact Us → App Review. Use it rarely and say plainly what is broken; a scripture-fidelity defect is a legitimate reason. 3. **Remove from sale** — last resort; existing installs keep working (the app is fully offline). ## Procedure 1. Reproduce and write the failing test first. Scripture text is never edited to "fix" anything — see the prime directive in the platform's [`docs/engineering/invariants.md`](https://github.com/Algorythmos-AI/sggs-platform/blob/main/docs/engineering/invariants.md). 2. Branch `hotfix/` **from this app's release tag** (not from a later `main`, which may already hold unreleased work): `git worktree add /wt-hotfix -b hotfix/ vX.Y.Z` 3. One number, both surfaces: the platform releases `X.Y.(Z+1)` too (never a one-sided hotfix — see its release runbook). Once that tag exists, `make vendor-sync-platform REF=vX.Y.(Z+1)` and set `MARKETING_VERSION` to `X.Y.(Z+1)`. Build numbers restart at the ledger's `next` for the new version. 4. PR `hotfix/` → `main` (squash). CI must be green: `gates`, `parity`, `app`. 5. Tag the app release `vX.Y.(Z+1)` on that `main` commit once its CI is green (the tag cannot be moved afterwards). Then, from the tag — a worktree, or the `iOS TestFlight upload` workflow run at the tag: `make testflight TEAM_ID=… BUILD=N CHANNEL=appstore UPLOAD=1` The script refuses a dirty tree, an off-trunk or untagged commit and red CI, exactly as for a normal release. 6. Commit the ledger row via PR. `make appstore-preflight` must pass. Re-sign Charter S on the new build number; re-run only the hardware checks the fix could affect, and say which. 7. Submit. After approval, release and resume (or restart) the phased rollout. 8. Write the incident note: what users saw, how it got past the gates, which gate now catches it. A hotfix without a new test or gate is not finished.