# App Ops Desk — Solo iOS Release Checklist Pack
Version: 1.0  
Brand: App Ops Desk  
Intended public URL: https://appopsdesk.com/checklists/solo-ios-release-checklist.md

Use before every archive/upload. Print it, keep it in the repo, or copy into your release PR.

---

## 0) Release identity (fill first)

| Field | Value |
|---|---|
| Date | |
| Marketing version | |
| Build number | |
| Git SHA | |
| Xcode version (`xcodebuild -version`) | |
| Destination | TestFlight / App Store |
| Why this build exists | |

If any field is blank, stop.

---

## 1) Toolchain

- [ ] Active Xcode is **supported** for App Store submission (not beta-only if uploading to Connect)
- [ ] `xcode-select -p` points at the Xcode you intend
- [ ] `xcodebuild -version` recorded in the release identity table
- [ ] You are not assuming “TestFlight worked last month” equals “this toolchain is fine”

```bash
xcode-select -p
xcodebuild -version
```

---

## 2) Project / binary identity

- [ ] Correct scheme
- [ ] Release configuration
- [ ] Correct bundle identifier
- [ ] Marketing version set intentionally
- [ ] Build number **higher** than every build already uploaded to App Store Connect
- [ ] No leftover debug feature flags / staging endpoints / test API keys

---

## 3) Symbols

- [ ] App dSYMs generated for Release/Archive
- [ ] Dependency/binary dSYM strategy known (Firebase/gRPC/etc. if used)
- [ ] Upload pipeline includes the symbols you think it includes

---

## 4) Privacy & store facts

- [ ] Purpose strings still match actual APIs used
- [ ] Privacy Nutrition answers still match SDKs
- [ ] Tracking/ATT stance unchanged or deliberately updated
- [ ] Export compliance answer known
- [ ] “Store facts” doc updated if dependencies changed

---

## 5) Critical path smoke (human, on archive build)

Install the archive build (not only a debug run) and tap:

- [ ] Launch / onboarding path
- [ ] Core create/log action
- [ ] Settings / account / export path (whatever is business-critical)
- [ ] Paywall or upgrade path if monetized
- [ ] No obvious permission crash on first prompt

Fix production hit targets. Do not weaken production UI just to make UI tests green.

---

## 6) Upload plan

- [ ] Destination chosen: TestFlight only **or** App Store candidate
- [ ] Tester notes drafted with **exact build number**
- [ ] Previous good build number written down (rollback reference)
- [ ] You have time to watch the upload/processing result (don’t fire-and-forget before a meeting)

### Tester note template

```text
Build <N> (<marketing version>)
What to test:
Known issues:
Obsolete builds for this test:
```

---

## 7) After upload

- [ ] Processing succeeded
- [ ] Correct build appears in Connect
- [ ] Release log updated with result
- [ ] If rejected: capture exact message + Xcode/SDK versions before changing random code

---

## Fast “stop now” signals

Stop and fix before retrying if:

1. Xcode is unsupported/beta for Connect
2. Build number didn’t increase
3. You can’t identify git SHA for the archive
4. Critical path wasn’t smoked on the archive build
5. Privacy answers are guesswork after adding an SDK

---

## Companion briefs

- Issue #0: 7 release failures that waste a week
- Issue #1: Versioning, build numbers, and release-train chaos

App Ops Desk · independent release-ops brief · not affiliated with Apple
