Summary
Three issues stopped the first EAS iOS builds of the new Ahad Pay app:
- READ_APP_CONFIG — import. `fe/app.config.ts` imported `./env` without an extension. eas-cli 25 (@expo/config 55 / require-utils) can load the config as ESM, where Node rejects extensionless imports. Now `./env.js` (works for CJS and ESM).
- READ_APP_CONFIG — env file. Root `.gitignore` listed the tracked `fe/.env.development` (added in 306f93a6). EAS archives through .gitignore, so the file was dropped (missing `API_URL` / `SECRET_KEY` / `VAR_NUMBER`). Ignore line removed; same class of values as the committed `.env.staging`.
- RUN_FASTLANE — Xcode. Every iOS profile used `image: latest` = Xcode 27.1 (sdk-58). Pinned to `sdk-53` (macos-sequoia-15.5-xcode-16.4), the image Expo maps to SDK 53. Android images unchanged.
After merge
- `eas.json` is a fingerprint input, so the runtimeVersion changes on both platforms: rebuild staging iOS and Android before the next `pnpm update:staging`, otherwise installed testers will not receive the OTA (see `fe/docs/ota-updates.md`).
- Not in this MR: `fe/.env.ui` is still ignored/untracked (ui profile would fail the same way); `android.image: latest` still floats.
Review
Opus gate: r1 PASS (import), r2 PASS (.gitignore), r3 PASS (image; SHOULD-FIX = the fingerprint note above, no code change).