Skip to content

Fix iOS App Store production bundle id - #7809

Merged
azooz2003-bit merged 7 commits into
mainfrom
task-itms-90055-bundle-id
Jul 10, 2026
Merged

azooz2003-bit merged 7 commits into
mainfrom
task-itms-90055-bundle-id

Conversation

@azooz2003-bit

@azooz2003-bit azooz2003-bit commented Jul 10, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • Change the iOS production App Store lane from com.cmuxterm.app to the App Store Connect app record bundle id com.cmux.app.
  • Add archive and signed-IPA identity gates so uploads fail if the archive app, embedded provisioning profile, or signed entitlements disagree with the selected lane.
  • Add a behavior-level regression test that executes the real App Store upload, profile-install, and validation entrypoints with fake Apple tooling.

Testing

  • python3 -m py_compile tests/test_ios_appstore_lane_identity.py && python3 tests/test_ios_appstore_lane_identity.py
  • python3 tests/test_ios_testflight_external_distribution.py && python3 tests/test_ios_testflight_notes.py
  • python3 tests/test_ci_change_areas.py
  • ./tests/test_ci_release_sdk_lane.sh && ./tests/test_ci_self_hosted_guard.sh && ./tests/test_ci_scheme_testaction_debug.sh
  • git ls-files 'tests/*.py' 'tests_v2/*.py' 'scripts/*.py' | xargs python3 -m py_compile (existing warning in tests/test_issue_1138_sidebar_pr_polling.py)

Issues

  • Fixes App Store Connect ITMS-90055 for Apple ID 6783338052, version 1.0.4, rejected build 20260710041749.

View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Note

Medium Risk
Changes production iOS signing/upload identity and release gates; mistakes block uploads but misconfigured ASC secrets or profiles could still delay releases until operators update credentials for com.cmux.app.

Overview
Switches the production App Store lane from com.cmuxterm.app to com.cmux.app everywhere defaults, docs, CI summaries, and provisioning-profile install logic apply, addressing App Store Connect ITMS-90055 when the ASC app record does not match the uploaded binary.

Fail-closed identity checks are added on the upload path: archives must match the lane bundle id; signed IPAs are checked for CFBundleIdentifier, embedded profile application-identifier, and signed entitlements; App Store uploads require a numeric ASC_APP_ID and verify ASC bundleId matches the lane before asc builds upload. Release validation no longer treats a bundle id as --app.

APNs accepts com.cmux.app as a production topic while keeping com.cmuxterm.app for existing tokens. CI runs tests/test_ios_appstore_lane_identity.py (fake Apple tooling) against the real upload, profile-install, and validation entrypoints.

Reviewed by Cursor Bugbot for commit aca4acd. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Switch iOS App Store production bundle id from com.cmuxterm.app to com.cmux.app, add strict identity gates for archives/signed IPAs/ASC uploads, and handle stale provisioning profile secrets. Resolves App Store Connect ITMS-90055 for Apple ID 6783338052, version 1.0.4.

  • Bug Fixes
    • Set the App Store lane bundle id to com.cmux.app across upload/validation/profile-install scripts, CI summary, and docs; default profile naming to “cmux App Store CI …”.
    • Enforce identity gates: block archive/IPA when CFBundleIdentifier, embedded profile application-identifier, or signed entitlements mismatch; hard-check push and Apple Sign In entitlements; allow overriding PlistBuddy via $PLISTBUDDY.
    • Bind uploads to ASC app identity: require numeric ASC_APP_ID, read the app record via asc apps view, and refuse upload if its bundle id differs from the lane.
    • Provisioning profile install: ignore a stale primary secret for the legacy bundle id, fall back to other secrets or fetch from ASC, and improve error messages.
    • Add a CI-portable regression test for upload, profile-install, and release validation; wired into CI. APNs: treat com.cmux.app as production while keeping com.cmuxterm.app allowlisted; update tests and schema comment.

Written for commit ca24ba7. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Updated iOS App Store production identity to com.cmux.app across lanes, docs, and checklists.
    • Added stronger pre-upload validation ensuring the IPA’s signing entitlements and bundle identifiers match the expected App Store identity.
    • Expanded archive validation to require the archived app’s CFBundleIdentifier matches the expected production bundle id.
  • Bug Fixes
    • Prevent App Store Connect uploads when the resolved app-id/bundle-id mapping is incorrect or the provided App Store Connect app id isn’t numeric.
    • Correctly classify com.cmux.app as production for APNs routing.
  • Tests
    • Added CI tests covering iOS App Store lane identity, provisioning profile selection, and failure scenarios.
  • Documentation
    • Updated iOS App Store release/review instructions to reference com.cmux.app.

@vercel

vercel Bot commented Jul 10, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Canceled Canceled Jul 10, 2026 11:11am
cmux-staging Building Building Preview, Comment Jul 10, 2026 11:11am

@coderabbitai

coderabbitai Bot commented Jul 10, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The App Store lane now uses com.cmux.app across provisioning, export, release validation, documentation, and workflow reporting. IPA bundle and entitlement identities are verified before upload, with mocked integration tests added to CI. APNs production routing and related tests also use the new bundle identifier.

Changes

App Store identity alignment

Layer / File(s) Summary
IPA identity validation
ios/scripts/upload-testflight.sh
Validates archived app identifiers and exported IPA signatures, bundle identifiers, provisioning entitlements, and signed entitlements before upload; PlistBuddy access is centralized.
App Store identifier and profile defaults
.github/scripts/install-app-store-provisioning-profile.sh, ios/scripts/validate-app-store-release.sh, .github/workflows/ios-app-store.yml, ios/AppStoreReview/*, ios/README.md
Updates App Store bundle and profile defaults, profile selection and ASC download validation, numeric app-id validation, workflow messaging, and documentation to use com.cmux.app.
Mocked identity regression coverage
tests/test_ios_appstore_lane_identity.py, .github/workflows/ci.yml
Adds mocked-toolchain checks for upload, App Store Connect validation, provisioning installation, stale-secret fallback, and release validation, and runs them in workflow guard tests.

APNs production bundle alignment

Layer / File(s) Summary
APNs routing and transport fixtures
web/services/apns/routePolicy.ts, web/tests/apns.test.ts
Classifies com.cmux.app as a production APNs bundle and updates sender-transport test device fixtures accordingly.

Estimated code review effort: 4 (Complex) | ~50 minutes

Sequence Diagram(s)

sequenceDiagram
  participant AppStoreLane
  participant xcodebuild
  participant codesign
  participant security
  participant IPAUpload
  AppStoreLane->>xcodebuild: Archive and export IPA
  AppStoreLane->>codesign: Verify embedded app signature
  AppStoreLane->>security: Decode provisioning profile and signed entitlements
  AppStoreLane->>AppStoreLane: Compare com.cmux.app identity values
  AppStoreLane->>IPAUpload: Upload after validation succeeds
Loading

Possibly related PRs

Suggested reviewers: lawrencecchen

🚥 Pre-merge checks | ✅ 24 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 3.70% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (24 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed The PR changes only shell scripts, workflows, docs, and a Python test; no Swift files or actor-isolation-sensitive production code were touched.
Cmux Swift Blocking Runtime ✅ Passed PR diff touches only shell scripts, tests, and workflow/docs; no Swift files or Swift synchronization primitives were introduced.
Cmux Browser Automation Off-Main ✅ Passed PR only touches iOS App Store signing/upload scripts and a CI test; no browser.* socket-worker/main-actor automation code changed.
Cmux Expensive Synchronous Load ✅ Passed HEAD changes only shell/yaml/python files; no Swift source was added or moved, so the expensive-sync-load rule is not triggered.
Cmux Cache Substitution Correctness ✅ Passed No production Swift/TS/JS code changed here; this commit only touches shell scripts and a Python test, so the cache-substitution rule doesn’t apply.
Cmux No Hacky Sleeps ✅ Passed No added fixed sleeps, timers, or polling loops in the touched runtime scripts; the new waits are dedicated asc builds wait and deterministic test stubs.
Cmux Algorithmic Complexity ✅ Passed No added nested scans or per-target rescans: the new shell/TS code is bounded one-pass validation over a single IPA or ASC API response, and tests/workflows are exempt.
Cmux Swift Concurrency ✅ Passed PR diff touches only shell, workflow, docs, TS, and Python files; no Swift files or Swift concurrency changes are introduced.
Cmux Swift @Concurrent ✅ Passed The PR changes only shell scripts, workflows, tests, and docs; no Swift files or Swift async annotations were modified.
Cmux Swift File And Package Boundaries ✅ Passed No production Swift files changed; the diff only touches shell scripts, workflows, docs, tests, and TS files.
Cmux Swiftpm Lockfiles ✅ Passed Diff only touches iOS scripts/workflow/tests; no Package.resolved, .gitignore, or Xcode package-reference changes were made.
Cmux Swift Logging ✅ Passed No Swift files were changed in this commit, so the Swift logging rule is not applicable.
Cmux User-Facing Error Privacy ✅ Passed The changed user-facing errors were sanitized to remove vendor/env-var details; no new privacy leaks were introduced in the diff.
Cmux Full Internationalization ✅ Passed Changes are limited to tests, workflows, operational iOS docs, and config tokens; no web messages or xcstrings were touched, so no new user-facing locale copy.
Cmux Swiftui State Layout ✅ Passed The diff only changes scripts, docs, workflow YAML, and tests; no SwiftUI views or state/layout patterns are introduced.
Cmux Architecture Rethink ✅ Passed PASS: HEAD only changes bash scripts, a workflow, and a Python test; no Swift files or Swift architecture patterns are introduced.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PASS: The diff touches only scripts/docs/TS/Python, with no .swift files or window-controller code, so the auxiliary-window shortcut rule is not applicable.
Cmux Source Artifacts ✅ Passed Changed paths are hand-written scripts/docs/tests/config, and no logs, caches, screenshots, temp dirs, or other artifact paths were added.
Cmux No Test Or Debug Seam In Production Source ✅ Passed The PR changes no Swift files under any production Sources/ path, so the no-test/debug-seam rule is not implicated.
Cmux No Ambient Global State ✅ Passed No production Swift files were changed; the diff only touches shell scripts, workflows, tests, and docs, so the ambient-global-state rule doesn’t apply.
Title check ✅ Passed The title is concise and accurately summarizes the main change: switching the iOS App Store production bundle id.
Description check ✅ Passed The description covers Summary, Testing, Issues, review trigger, and checklist items, with only the demo video section omitted.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch task-itms-90055-bundle-id

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@blacksmith-sh

This comment has been minimized.

@greptile-apps

greptile-apps Bot commented Jul 10, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR moves the iOS App Store production identity to com.cmux.app. The main changes are:

  • Updates App Store release scripts, workflow text, and docs for the new bundle id.
  • Adds archive, signed IPA, provisioning profile, entitlement, and App Store Connect identity checks before upload.
  • Keeps APNs production routing for the legacy bundle id while adding the new production bundle id.
  • Adds tests for the App Store lane identity, stale profile fallback, and numeric app id validation.

Confidence Score: 5/5

This looks safe to merge.

  • No blocking issues found in the changed code.
  • The stale primary profile path now falls through to fallback profile resolution.
  • Existing APNs tokens for the old production bundle remain accepted.

Important Files Changed

Filename Overview
.github/scripts/install-app-store-provisioning-profile.sh Primary profile validation now falls through on stale bundle-id profiles instead of stopping before fallback resolution.
ios/scripts/upload-testflight.sh The App Store lane now verifies archive, IPA, profile, entitlement, and app-record identity before upload.
ios/scripts/validate-app-store-release.sh Release validation now requires a numeric App Store Connect app id instead of accepting a bundle id.
web/services/apns/routePolicy.ts APNs routing accepts the new production bundle id while preserving the old production bundle id.
tests/test_ios_appstore_lane_identity.py Adds behavior tests for the App Store lane identity and provisioning-profile fallback behavior.

Reviews (5): Last reviewed commit: "Handle stale App Store profile secrets" | Re-trigger Greptile


TEAM_ID="${IOS_APPSTORE_TEAM_ID:-7WLXT3NR37}"
BUNDLE_IDENTIFIER="${IOS_APPSTORE_BUNDLE_IDENTIFIER:-com.cmuxterm.app}"
BUNDLE_IDENTIFIER="${IOS_APPSTORE_BUNDLE_IDENTIFIER:-com.cmux.app}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Stale Secret Blocks Fallback

When IOS_APPSTORE_PROVISIONING_PROFILE_BASE64 still contains a profile for the old com.cmuxterm.app id, this new default makes EXPECTED_APP_ID become 7WLXT3NR37.com.cmux.app. The strict secret-profile validation exits immediately on that mismatch, so the later App Store Connect download/create fallback never runs and the App Store workflow fails before it can mint the new profile.


TEAM_ID="${IOS_APPSTORE_TEAM_ID:-7WLXT3NR37}"
BUNDLE_IDENTIFIER="${IOS_APPSTORE_BUNDLE_IDENTIFIER:-com.cmuxterm.app}"
BUNDLE_IDENTIFIER="${IOS_APPSTORE_BUNDLE_IDENTIFIER:-com.cmux.app}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Stale profile still exits

This default makes EXPECTED_APP_ID resolve to 7WLXT3NR37.com.cmux.app, but the primary IOS_APPSTORE_PROVISIONING_PROFILE_BASE64 path is still validated with strict=true. When that secret still contains the old com.cmuxterm.app profile, validate_profile calls die on the app-id mismatch and the script exits before the App Store Connect download/create fallback can run. The workflow can still fail before it has a chance to mint or install the new com.cmux.app profile.


TEAM_ID="${IOS_APPSTORE_TEAM_ID:-7WLXT3NR37}"
BUNDLE_IDENTIFIER="${IOS_APPSTORE_BUNDLE_IDENTIFIER:-com.cmuxterm.app}"
BUNDLE_IDENTIFIER="${IOS_APPSTORE_BUNDLE_IDENTIFIER:-com.cmux.app}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Stale secret still exits

When IOS_APPSTORE_PROVISIONING_PROFILE_BASE64 still contains a profile for the old com.cmuxterm.app id, this default makes EXPECTED_APP_ID resolve to 7WLXT3NR37.com.cmux.app. The primary secret path is still validated in strict mode later in the script, so that app-id mismatch exits before the non-strict fallback secrets or App Store Connect download/create path can run. The App Store workflow can still fail immediately instead of minting and installing the new com.cmux.app profile.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/test_ios_appstore_lane_identity.py`:
- Around line 243-289: Ensure the App Store lane exercised by
test_upload_appstore_lane_uses_production_bundle_id reaches the export step and
creates ExportOptions.plist at the expected upload directory. Inspect
upload-app-store.sh and its relationship to upload-testflight.sh, preserving
CMUX_FAKE_EXPORT_OPTIONS_COPY in the xcodebuild subprocess environment and
aligning export paths/options so the fake xcodebuild can copy the generated
plist. Verify the wrapper invokes the corrected production bundle-ID flow and
propagates all required environment variables.
- Around line 228-240: Remove the unused tmp parameter from _run and update
every call site to stop passing it, or use tmp explicitly for temporary-file
isolation; ensure the function signature and all invocations remain consistent.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 96d491d3-6d5b-4b7a-abc0-dcbf89a2109f

📥 Commits

Reviewing files that changed from the base of the PR and between 06c9978 and 1c17a60.

📒 Files selected for processing (6)
  • .github/scripts/install-app-store-provisioning-profile.sh
  • .github/workflows/ci.yml
  • .github/workflows/ios-app-store.yml
  • ios/scripts/upload-testflight.sh
  • ios/scripts/validate-app-store-release.sh
  • tests/test_ios_appstore_lane_identity.py

Comment on lines +228 to +240
def _run(args: list[str], *, env: dict[str, str], tmp: Path) -> subprocess.CompletedProcess[str]:
result = subprocess.run(
args,
cwd=ROOT,
env=env,
text=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
if result.returncode != 0:
print(result.stdout)
print(result.stderr, file=sys.stderr)
return result

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

_run has an unused tmp parameter.

The tmp parameter is passed to _run but never referenced in the function body. Either remove it or use it for temp-file isolation.

♻️ Proposed fix
 def _run(args: list[str], *, env: dict[str, str], tmp: Path) -> subprocess.CompletedProcess[str]:
     result = subprocess.run(
         args,
         cwd=ROOT,
         env=env,
         text=True,
         stdout=subprocess.PIPE,
         stderr=subprocess.PIPE,
     )

Either remove tmp:

-def _run(args: list[str], *, env: dict[str, str], tmp: Path) -> subprocess.CompletedProcess[str]:
+def _run(args: list[str], *, env: dict[str, str]) -> subprocess.CompletedProcess[str]:

and update call sites, or use it for additional temp-file cleanup.

🧰 Tools
🪛 ast-grep (0.44.1)

[error] 228-235: Use of unsanitized data to create processes
Context: subprocess.run(
args,
cwd=ROOT,
env=env,
text=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(os-system-unsanitized-data)


[error] 228-235: Command coming from incoming request
Context: subprocess.run(
args,
cwd=ROOT,
env=env,
text=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)

🪛 Ruff (0.15.20)

[warning] 228-228: Unused function argument: tmp

(ARG001)


[warning] 229-236: Prefer capture_output over sending stdout and stderr to PIPE

Replace with capture_output keyword argument

(UP022)


[error] 229-229: subprocess call: check for execution of untrusted input

(S603)


[warning] 229-229: subprocess.run without explicit check argument

Add explicit check=False

(PLW1510)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_ios_appstore_lane_identity.py` around lines 228 - 240, Remove the
unused tmp parameter from _run and update every call site to stop passing it, or
use tmp explicitly for temporary-file isolation; ensure the function signature
and all invocations remain consistent.

Source: Linters/SAST tools

Comment on lines +243 to +289
def test_upload_appstore_lane_uses_production_bundle_id(tmp: Path, fakebin: Path) -> None:
env = _base_env(tmp, fakebin)
env["CMUX_IOS_UPLOAD_DIR"] = str(tmp / "upload")
env["CMUX_BUILD_NUMBER_OUT_FILE"] = str(tmp / "build-number.txt")
result = _run(
[
"bash",
str(ROOT / "ios" / "scripts" / "upload-app-store.sh"),
"--signing",
"manual",
"--export-only",
"--build-number",
"20260710041750",
],
env=env,
tmp=tmp,
)
_check(result.returncode == 0, "appstore export-only lane succeeds with fake Apple tools")
_check("signed IPA bundle identity verified: com.cmux.app" in result.stdout, "signed IPA identity gate passes")

xcodebuild_calls = [
json.loads(line)
for line in (tmp / "xcodebuild.jsonl").read_text(encoding="utf-8").splitlines()
]
archive_call = next(call for call in xcodebuild_calls if "archive" in call)
_check(
f"PRODUCT_BUNDLE_IDENTIFIER={APPSTORE_BUNDLE_ID}" in archive_call,
"archive command stamps com.cmux.app",
)
_check(
all("PRODUCT_BUNDLE_IDENTIFIER=com.cmuxterm.app" not in call for call in archive_call),
"archive command does not stamp the retired com.cmuxterm.app id",
)

export_options = plistlib.loads((tmp / "ExportOptions.plist").read_bytes())
profiles = export_options.get("provisioningProfiles", {})
_check(
profiles.get(APPSTORE_BUNDLE_ID) == "cmux App Store Distribution",
"export options map the App Store profile to com.cmux.app",
)
_check("com.cmuxterm.app" not in profiles, "export options do not include the retired app id")

ipa_line = next(line for line in result.stdout.splitlines() if line.startswith("IPA_PATH="))
ipa_path = Path(ipa_line.removeprefix("IPA_PATH="))
with zipfile.ZipFile(ipa_path) as zf:
info = plistlib.loads(zf.read("Payload/cmux.app/Info.plist"))
_check(info.get("CFBundleIdentifier") == APPSTORE_BUNDLE_ID, "final signed IPA Info.plist is com.cmux.app")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🔴 Critical

Pipeline failure: ExportOptions.plist is never created, causing FileNotFoundError at line 277.

The CI workflow-guard-tests job fails because test_upload_appstore_lane_uses_production_bundle_id crashes with FileNotFoundError: '/tmp/.../upload-test/ExportOptions.plist'. The fake xcodebuild copies the export options plist to CMUX_FAKE_EXPORT_OPTIONS_COPY only when it reaches the -exportArchive branch (line 135), but the file is never created — meaning either the upload script fails before the export step, or CMUX_FAKE_EXPORT_OPTIONS_COPY is not available in the xcodebuild subprocess environment.

The test calls upload-app-store.sh (line 250), but the changes under review are in upload-testflight.sh. If upload-app-store.sh is a wrapper, it may not propagate CMUX_FAKE_EXPORT_OPTIONS_COPY or may set up different export paths. The _check assertions are non-raising, so the test continues past failed returncode/stdout checks until it hits the unhandled FileNotFoundError.

🔍 Verification script to investigate the root cause
#!/bin/bash
# Check if upload-app-store.sh exists and its relationship to upload-testflight.sh
ls -la ios/scripts/upload-app-store.sh 2>/dev/null || echo "upload-app-store.sh not found"
file ios/scripts/upload-app-store.sh 2>/dev/null || true
head -30 ios/scripts/upload-app-store.sh 2>/dev/null || true

# Check if it's a symlink
readlink -f ios/scripts/upload-app-store.sh 2>/dev/null || true

# Check if it sources or calls upload-testflight.sh
rg -n 'upload-testflight|upload_app_store|source|exec' ios/scripts/upload-app-store.sh 2>/dev/null || true

# Check how ExportOptions.plist is created in the upload script
rg -n 'ExportOptions|exportOptions|CMUX_FAKE_EXPORT_OPTIONS_COPY' ios/scripts/upload-testflight.sh | head -20
🧰 Tools
🪛 GitHub Actions: CI / 12_workflow-guard-tests.txt

[error] 277-277: FileNotFoundError while reading '/tmp/tmprmo5y00n/upload-test/ExportOptions.plist' using plistlib.loads((tmp / 'ExportOptions.plist').read_bytes()). ExportOptions.plist was not created.

🪛 GitHub Actions: CI / workflow-guard-tests

[error] 277-277: Test failed due to missing export options file: FileNotFoundError: No such file or directory: '/tmp/tmprmo5y00n/upload-test/ExportOptions.plist'

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_ios_appstore_lane_identity.py` around lines 243 - 289, Ensure the
App Store lane exercised by test_upload_appstore_lane_uses_production_bundle_id
reaches the export step and creates ExportOptions.plist at the expected upload
directory. Inspect upload-app-store.sh and its relationship to
upload-testflight.sh, preserving CMUX_FAKE_EXPORT_OPTIONS_COPY in the xcodebuild
subprocess environment and aligning export paths/options so the fake xcodebuild
can copy the generated plist. Verify the wrapper invokes the corrected
production bundle-ID flow and propagates all required environment variables.

Source: Pipeline failures

@azooz2003-bit
azooz2003-bit merged commit 2d90fff into main Jul 10, 2026
34 of 36 checks passed

This branch was successfully deployed

1 active deployment
Preview – cmux — ca24ba75 Deployed Jul 10, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant