← Codex TestFlight ReleaseCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to Codex TestFlight Release
Snapshot Sep 30, 2026 · 23:14 UTC · version 0.1.1
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "codex-ios-api-build",
"description": "Build and upload iOS TestFlight builds from Codex using xcodebuild archive/export and App Store Connect API authentication. Use when the user asks to create a new TestFlight build, bump an iOS build number, archive an iOS app, upload via API key, set no-encryption export compliance, or automate TestFlight What to Test notes.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 269
},
{
"relative_path": "examples/appstoreconnect.env.example",
"size_in_bytes": 106
},
{
"relative_path": "scripts/build_testflight_api.sh",
"size_in_bytes": 3391
},
{
"relative_path": "scripts/set_testflight_whats_new.js",
"size_in_bytes": 8356
}
],
"skill_md_contents": "---\nname: codex-ios-api-build\ndescription: Build and upload iOS TestFlight builds from Codex using xcodebuild archive/export and App Store Connect API authentication. Use when the user asks to create a new TestFlight build, bump an iOS build number, archive an iOS app, upload via API key, set no-encryption export compliance, or automate TestFlight What to Test notes.\nlicense: MIT\ncompatibility: Requires macOS with Xcode and xcodebuild, Node.js, Python 3, App Store Connect API credentials stored outside the repository, and network access.\n---\n\n# Codex iOS API Build\n\n## Purpose\n\nCreate repeatable iOS TestFlight builds without opening Xcode UI:\n\n1. bump `CURRENT_PROJECT_VERSION`,\n2. archive for generic iOS device,\n3. export/upload with `xcodebuild -exportArchive`,\n4. authenticate using a local App Store Connect API key,\n5. verify App Store Connect sees the build,\n6. set TestFlight \"What to Test\" through App Store Connect API.\n\n## Security Rules\n\n- Never print `.p8` private key content.\n- Keep App Store Connect API keys outside repos and outside synced folders.\n- Use a local env file such as `$HOME/.private_keys/appstoreconnect.env`.\n- Do not commit archives, exported IPA files, API keys, `.p8` files, or Xcode distribution logs.\n- Treat App Store Connect `Key ID`, `Issuer ID`, Team ID, and key path as sensitive operational data.\n\nExpected local env shape:\n\n```bash\nASC_KEY_ID=YOUR_KEY_ID\nASC_ISSUER_ID=YOUR_ISSUER_ID\nASC_KEY_PATH=/absolute/path/to/AuthKey_YOUR_KEY_ID.p8\n```\n\n## Standard Workflow\n\nRun from your iOS project repository root:\n\n```bash\nPROJECT_PATH=ios/MyApp/MyApp.xcodeproj \\\nSCHEME=MyApp \\\nEXPORT_OPTIONS=build/ExportOptions-TestFlight.plist \\\n/path/to/codex-testflight-release/skills/codex-ios-api-build/scripts/build_testflight_api.sh 123\n```\n\nRequired environment variables for a public project:\n\n- `PROJECT_PATH`: path to the `.xcodeproj`\n- `SCHEME`: Xcode scheme to archive\n- `EXPORT_OPTIONS`: export options plist for App Store/TestFlight upload\n\nArchive output defaults to `build/<scheme>-<build>.xcarchive`.\nExport output defaults to `build/<scheme>-<build>-export`.\n\n## No Encryption\n\nWhen the app only uses exempt standard encryption, add this generated Info.plist build setting before archiving:\n\n```text\nINFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;\n```\n\nVerify the archived app:\n\n```bash\n/usr/libexec/PlistBuddy -c 'Print :ITSAppUsesNonExemptEncryption' build/MyApp-123.xcarchive/Products/Applications/MyApp.app/Info.plist\n```\n\nExpected value: `false`.\n\n## What to Test\n\nAfter upload, set TestFlight \"What to Test\":\n\n```bash\n/path/to/codex-testflight-release/skills/codex-ios-api-build/scripts/set_testflight_whats_new.js \\\n com.example.myapp \\\n 123 \\\n en-US \\\n \"Test sign-in, main workflow, sync, and the new release changes.\"\n```\n\nThe helper uses App Store Connect API `betaBuildLocalizations`: it finds the app by bundle ID, finds the build by build number, then creates or updates the build localization.\n\n## External TestFlight groups\n\nSet `ASC_BETA_GROUP` to the exact external group name and optionally set `ASC_SUBMIT_BETA_REVIEW=true`. The metadata helper assigns the processed build to that group and submits it for Beta App Review when required.\n\nThe export options plist must set `testFlightInternalTestingOnly` to `false` or omit it. An internal-only build is permanently ineligible for external groups, so the build helper validates this before archiving.\n\n## Verification\n\nAlways verify:\n\n1. Archive succeeded: output includes `** ARCHIVE SUCCEEDED **`.\n2. Upload succeeded: output includes `Uploaded package is processing`, `Upload succeeded`, and `** EXPORT SUCCEEDED **`.\n3. API sees the expected build number and processing state.\n4. Info.plist includes `ITSAppUsesNonExemptEncryption = false` when no-encryption compliance is expected.\n5. `set_testflight_whats_new.js` reports `Updated What to Test` or `Created What to Test`.\n6. When `ASC_BETA_GROUP` is configured, the helper confirms assignment to the named external group and reports the Beta App Review state.\n\nAcceptable processing states include `PROCESSING` shortly after upload and `VALID` once Apple finishes.\n"
}SHA-256: 2000f3e01abdd9b4328a9ea156051015e95fc8f11d8c97ee3c1bb36b4f94ae84