Quality Gates
These gates are evidence, not ceremony. Mobile bugs often appear only after native build, install, permission, or store steps.
Required Gates
| Gate | Required evidence |
|---|---|
| Dependency compatibility | npx expo install --check or documented equivalent review |
| Type and lint | Project-specific TypeScript/lint commands pass, or missing commands are documented |
| Unit and screen tests | Jest tests pass for changed API hooks, stores, screens, and route behavior |
| Router smoke | New/changed route opens, params resolve, links are typed when enabled, not-found path behaves |
| Native rebuild | Native-boundary changes have a development/preview rebuild or a clear blocker |
| Android install | APK/dev build installed on emulator or device for user-visible native changes |
| iOS install | Simulator, device, or TestFlight path checked for iOS-facing changes |
| Release artifact | Android AAB or iOS IPA build attempted before release claims |
| OTA safety | Runtime version, branch/channel target, rollout percentage, and rollback path documented |
| Permissions | Android and iOS permission prompts, denied paths, config strings, and store rationale checked |
| Secrets | No EAS token, service account key, Apple credential, keystore, provisioning profile, or API secret committed |
Definition Of Done Note
Every Expo implementation handoff should include:
Expo SDK: <version>
Native changes: <none/list>
Commands run: <commands and results>
Tests: <commands and results>
Development build: <installed/not needed/blocker>
Android release: <AAB/APK status or blocker>
iOS release: <IPA/TestFlight/simulator status or blocker>
OTA: <not applicable/runtime/branch/channel/rollback>
Permissions: <grant/deny/store-policy status>
Known gaps: <what was not tested>
Release Minimums
| Stage | Minimum proof |
|---|---|
| Prototype | App starts, one main route works, no unexplained dependency warnings |
| Development build | Dev client installed and JavaScript reloads against Metro |
| Preview/internal | Signed installable build works on at least one Android and one iOS path when both platforms matter |
| Store release | Production Android AAB and iOS IPA/TestFlight path built; store metadata and privacy blockers listed |
| OTA release | Preview branch smoke passes on a compatible binary; production update has rollback plan |
What Does Not Count
- Expo Go only, when the change touches native code, config, permissions, or release behavior.
- A passing Jest run as proof of store readiness.
- A screenshot without command output or build identifier.
- An OTA update that changes behavior requiring new native permissions.
- A release claim without package name, bundle identifier, version, build number, runtime version, and target track/channel.
Warning: If an AI agent cannot run iOS locally from Linux, it must say so. EAS can build iOS remotely, but that is not the same as local simulator verification.