← back to Nineoh Guide
chore(mobile): TK-12 App Store/TestFlight prep — prefill eas.json submit (appleId+teamId), add production runbook
c0e6ddb8c1ed1f5bb4bcc6059c3abe2f0a97f54b · 2026-07-27 16:19:28 -0700 · Steve
Config-only + docs. Production build/submit gated → approval memo in yolo-queue.
RN 0.76.5 kept (known-good); 0.76.9 alignment recommended as a validated pre-build step.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Files touched
M apps/mobile/EAS-BUILD-NOTES.mdM apps/mobile/eas.json
Diff
commit c0e6ddb8c1ed1f5bb4bcc6059c3abe2f0a97f54b
Author: Steve <steve@designerwallcoverings.com>
Date: Mon Jul 27 16:19:28 2026 -0700
chore(mobile): TK-12 App Store/TestFlight prep — prefill eas.json submit (appleId+teamId), add production runbook
Config-only + docs. Production build/submit gated → approval memo in yolo-queue.
RN 0.76.5 kept (known-good); 0.76.9 alignment recommended as a validated pre-build step.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
apps/mobile/EAS-BUILD-NOTES.md | 55 ++++++++++++++++++++++++++++++++++++++++++
apps/mobile/eas.json | 4 +--
2 files changed, 57 insertions(+), 2 deletions(-)
diff --git a/apps/mobile/EAS-BUILD-NOTES.md b/apps/mobile/EAS-BUILD-NOTES.md
index a3ed6d5..1b91250 100644
--- a/apps/mobile/EAS-BUILD-NOTES.md
+++ b/apps/mobile/EAS-BUILD-NOTES.md
@@ -50,3 +50,58 @@ NOT enough — it has to be *selected into the profile* when the build runs.
- Interactive EAS commands need a real TTY — they fail under the Claude `!` prefix and
under the Bash tool ("stdin is not readable"). Run them in a plain terminal tab.
- Registered devices: Mac `00006032-000C692614DA401C`, iPhone `00008150-001039662E3B401C`.
+
+## App Store / TestFlight (production) path — TK-12
+
+Ad-hoc (above) and store are DIFFERENT credential worlds. Store needs a **Distribution
+Certificate** + an **App Store provisioning profile** (not the ad-hoc profile), and an
+**App Store Connect app record** (`ascAppId`). `eas.json` `production` profile is ready
+(`distribution: store`, `autoIncrement: true`); `submit.production.ios` is pre-filled with
+`appleId: steveabramsdesigns@gmail.com` + `appleTeamId: 3VAV3KMNZK`; only `ascAppId` is
+still `SET-AT-SUBMIT` (it doesn't exist until the ASC app record is made).
+
+### The one-time unlock: App Store Connect API key (recommended — makes build+submit headless)
+Interactive Apple credential setup fails under the Bash/`!` tool (no TTY). An **ASC API key**
+removes every prompt for BOTH build and submit:
+1. App Store Connect → **Users and Access → Integrations → App Store Connect API** →
+ generate a **Team key** (role: App Manager or Admin). Download the `.p8` **once**
+ (non-recoverable), note the **Key ID** + **Issuer ID**.
+2. Route it via the `secrets` skill; reference in `eas.json` (or `credentials.json`) so
+ `eas build`/`eas submit --non-interactive` run with zero prompts.
+ ⚠️ Interactive alt (no key): run `npx eas-cli build -p ios --profile production` in a
+ REAL terminal, Apple login + 2FA once. This **consumes 1 of only 2** Individual-account
+ Distribution-cert slots — Steve's call.
+
+### Pre-build hygiene (recommended, do before the FIRST production build)
+`expo-doctor` flags `react-native 0.76.5 → 0.76.9` (Expo SDK 52's expected patch). The
+preview cloud builds all succeeded on **0.76.5**, so it is NOT a hard blocker — but align
+it on the first production build and confirm the build passes before trusting it:
+```
+cd ~/Projects/nineoh-guide/apps/mobile
+npx expo install react-native@0.76.9 # then the production build below VALIDATES it
+```
+(Left at 0.76.5 in git deliberately — an unvalidated bump shouldn't ride a config-only prep commit.)
+
+### Build (production, store-signed .ipa — one EAS build slot)
+```
+cd ~/Projects/nineoh-guide/apps/mobile
+npx eas-cli build -p ios --profile production # add --non-interactive once ASC key is set
+npx eas-cli build:view <id> # poll until finished
+```
+
+### Submit → TestFlight ⛔ GATED (App Store submit — Steve-approved only)
+```
+npx eas-cli submit -p ios --profile production --latest
+```
+Uploads to App Store Connect → TestFlight after Apple processing (~5–30 min).
+⚠️ **`ascAppId` is still the non-numeric sentinel `SET-AT-SUBMIT`.** Before running submit,
+EITHER **delete the `ascAppId` line** from `eas.json` (then `eas submit` auto-detects the app
+by bundle id, or creates the ASC app record on first run) **OR** paste the real numeric id.
+Do NOT run `eas submit` with the sentinel string in place — behavior is EAS-CLI-version-
+dependent and errors confusingly. After the first submit, capture the numeric `ascAppId` it
+prints back into `eas.json` for subsequent runs.
+
+### ⚠️ App Review risk to surface
+"Unofficial 90210 Guide" references a trademarked TV property. Guideline 4.1 (Copycats) /
+5.2 (Intellectual Property) — unofficial third-party-IP guide apps are a known rejection
+risk. Worth a disclaimer + original-content framing before submit.
diff --git a/apps/mobile/eas.json b/apps/mobile/eas.json
index 5047700..5ac2c7b 100644
--- a/apps/mobile/eas.json
+++ b/apps/mobile/eas.json
@@ -25,9 +25,9 @@
"submit": {
"production": {
"ios": {
- "appleId": "SET-AT-SUBMIT",
+ "appleId": "steveabramsdesigns@gmail.com",
"ascAppId": "SET-AT-SUBMIT",
- "appleTeamId": "SET-AT-SUBMIT"
+ "appleTeamId": "3VAV3KMNZK"
}
}
}
← 97a30ae chore: lint pass, cast-route null-coalesce fix, seed DB guar
·
back to Nineoh Guide
·
TK-12: turnkey finish-tk12.sh — one command post-ASC-key dri 3b23bfc →