Skip to content

ci(iOS): build simulator test product once - #13600

Merged
teamleaderleo merged 16 commits into
mainfrom
chatgpt/13538-ios-build-once
Sep 23, 2026
Merged

teamleaderleo merged 16 commits into
mainfrom
chatgpt/13538-ios-build-once

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator

iPhone and iPad CI jobs currently compile the same simulator test product separately. This change builds it once, uploads the product, and runs both device families with test-without-building after verifying its source, toolchain, package identity and content digest.

Focused dispatches allocate only the requested device family. Package-only dispatches remain package-only. Selected-test execution checks, simulator retries, runner identity checks and aggregate failure reporting remain in place.

The producer explicitly selects the default cmux test plan or the requested cmux-ui plan. The product validator recognizes the standard simulator XCTest host for unhosted package tests, verifies that exact executable inside the selected Xcode installation on each machine, and keeps test bundles and UI apps confined to the verified product.

Validation:

  • Twelve product/workflow tests and four dispatch-ref cases pass locally; registry validation reports no errors.
  • First hosted run compiled successfully in 108.648 seconds and exposed the multiple-plan packaging defect. Tests-only CI reproduced the missing-plan cases before the fix.
  • Second hosted run compiled in 82.179 seconds and exposed rejection of Xcode's standard platform XCTest host. Tests-only CI reproduced that failure before the fix.
  • Actual shared-product run built once in 77.735 seconds and uploaded a 345,010,903-byte archive (25.820 seconds packaging; 5.041 seconds upload). Both iPhone and iPad consumers verified the same product digest and each started at least 263 distinct tests without rebuilding. This proves product handoff and actual execution, not a passing application suite: both consumers reported application assertions and the same 60-second test timeout; no final suite total was emitted.
  • iPad download/restore took 194.983/3.944 seconds; iPhone took 190.645/5.251 seconds. Transfer cost is substantial; these results do not establish a wall-clock speedup.
  • The final main refresh at ed553ee preserves both test registry entries and changes no iOS workflow, helper, app/package, or Ghostty inputs relative to the exercised 4aecd42 source. All five required merge checks pass on ed553ee.

Four inherited package-convention violations remain outside this PR; their failure is still reported. These runs are functional validation, not a comparative speed benchmark.

— CopperPlover g1 🪙
Run: run_cmux_ios_e2e_efficiency_20260923_03

@coderabbitai

coderabbitai Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration

Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 8a670abf-9e09-4f23-a5c4-0d4765e50faf

📥 Commits

Reviewing files that changed from the base of the PR and between 432b110 and ed553ee.

📒 Files selected for processing (8)
  • .github/workflows/ci-guards.yml
  • .github/workflows/test-ios.yml
  • scripts/ci/ios_simulator_test_product.py
  • scripts/ci/select_ios_simulator.py
  • tests/test-execution.toml
  • tests/test_ci_self_hosted_guard.sh
  • tests/test_ios_simulator_build_once.py
  • tests/test_ios_workflow_dispatch_ref.py
 __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
< I've seen things you people wouldn't believe. Inefficient loops on fire off the shoulder of Orion. I've observed algorithms unfold in the dark near the Tannhäuser Gate, and watched data structures dissolve into the void of garbage collection. All those moments will be lost in my transient GPU cache, like tears in rain. >
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  \
   \   \
        \ /\
        ( )
      .( o ).
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

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.

Copy link
Copy Markdown
Collaborator Author

The implementation is already present on this draft (2 commits, producer/consumer code), so the PR description's "implementation will be added as the second commit" status is stale.

Before marking ready, please add the real hosted full iPhone+iPad measurement requested in #13538:

  • producer build-for-testing wall time;
  • packaged artifact size;
  • upload + download + restore time;
  • iPhone and iPad test-without-building wall;
  • total allocated macOS runner-minutes;
  • end-to-end workflow wall;
  • comparison against an equivalent current duplicate-build run.

The decision criterion is economic: compile-once only wins if duplicate compile removed exceeds product-transfer/setup cost while preserving the existing selector/retry/test-plan semantics. Keep this draft until that evidence is attached.

Copy link
Copy Markdown
Collaborator Author

One more integration requirement before this rebases onto current main:

This PR adds a new workflow-guard-tests matrix step:

  • Validate iOS simulator build-once contract
  • group: release-ios
  • direct input: tests/test_ios_simulator_build_once.py

Since #13585 landed, every such step/input must be declared in scripts/ci/workflow_guard_groups.py. After rebasing onto current main (and the #13609 ownership hotfix), add:

  • the step to STEP_OWNERS as release-ios;
  • the test path to PATH_OWNERS as release-ios (the generic test scanner will additionally select quality-determinism).

Otherwise the ownership drift test will correctly reject this branch even if the iOS producer/consumer implementation itself is sound.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

Please review the current draft implementation, especially product provenance/relocation, artifact extraction assumptions, device-family portability, focused test semantics, and fail-closed behavior. Measurement is still intentionally pending.

@coderabbitai

coderabbitai Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

@teamleaderleo I will review the current draft implementation. I will treat the hosted measurement as a merge gate, not as a missing implementation detail.

⚠️ Action not completed

Head commit changed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@github-actions

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

Head is now rebased onto current main. Please review the current producer/consumer implementation and runner/product trust contracts; hosted iPhone+iPad economics remain the deliberate merge gate.

@coderabbitai

coderabbitai Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

@teamleaderleo I will review the current PR head. I will check the producer/consumer flow, product provenance and relocation, artifact extraction, device-family and focused-test semantics, and fail-closed runner and product trust contracts. I will treat the hosted iPhone+iPad measurement as a required merge gate.

⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

The requested-family matrix fix is extracted into #13863 so an iPhone-only dispatch no longer allocates an iPad Mac just to skip its steps. Please retain that Linux-validated matrix selection and descriptive run name when rebasing this build-once draft. Product provenance/transfer and the hosted economics gate remain scoped here.

@teamleaderleo
teamleaderleo marked this pull request as ready for review September 23, 2026 03:00
@cursor

cursor Bot commented Sep 23, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@blacksmith-sh

This comment has been minimized.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owning the download follow-up requested by the user: ci/ios-test-product-transfer, starting from reviewed iOS head ed553ee4611d230bb3348f2467eb5466ec367702 and reusing #13749's existing range transport at 0f28e77a489656aa466eabafdc56d580b416c8f2 (will use landed bases when available). Expected files: .github/workflows/test-ios.yml, scripts/ci/parallel_artifact_download.py, and its existing behavioral test file. In parallel I am checking a narrow staging reduction in scripts/ci/ios_simulator_test_product.py with its existing tests: preserve runtime bundles and diagnostics, remove only demonstrably unused compile outputs.

The 345 MB payload is already gzip-compressed; outer upload compression level 0 avoids a second compression pass. The two device jobs already transfer concurrently. The proposed addition parallelizes byte ranges within each transfer while retaining exact-run, provider digest, inner archive, and product identity verification. Current #13600 proof and branch remain unchanged. No new native dispatch or artifact download from this task.

— FlintRail g1 🪄

@teamleaderleo
teamleaderleo merged commit 0f0d4a7 into main Sep 23, 2026
55 of 56 checks passed
rustybret pushed a commit to rustybret/bmux that referenced this pull request Sep 23, 2026
069f1ce ci: streamline app-host test consumers (manaflow-ai#13427)
cfe69ec Merge pull request manaflow-ai#13885 from teamleaderleo/docs/full-ci-explicit-scope
25a6378 docs: require explicit broad-suite intent for full-ci
0a6c362 Merge pull request manaflow-ai#13749 from manaflow-ai/ci/app-host-product-fast-transport
3094a95 ci: overlap local Rust helper builds with nightly Swift compilation (manaflow-ai#13874)
ea4b13b CI: run Claude wrapper regressions without compiling the app (manaflow-ai#13869)
8f1491b test: bound SSH fish helper pipe draining (manaflow-ai#13408)
9667375 Merge pull request manaflow-ai#13826 from manaflow-ai/12284-claude-wrapper-subcommands
40b0cd7 ci: scope trusted web complexity before Bun setup (manaflow-ai#13598)
0f0d4a7 ci(iOS): build simulator test product once (manaflow-ai#13600)
0f28e77 Merge main settings runtime repair for native validation
819adce Merge branch 'main' of https://github.com/manaflow-ai/cmux into 12284-claude-wrapper-subcommands
7442bf7 Merge remote-tracking branch 'origin/main' into 12284-claude-wrapper-subcommands
b6507c7 Merge remote-tracking branch 'origin/main' into 12284-claude-wrapper-subcommands
eed9ca5 Merge main to use corrected test execution and CI routing
645e8af test: control the Claude catalog cache clock
3c0637d Merge remote-tracking branch 'origin/main' into 12284-claude-wrapper-subcommands
6229cdc fix: expire successful Claude command discovery catalogs
6f775da test: require bounded Claude command cache freshness
2132e30 fix: preserve cancellation during Claude command discovery
7ac2789 Merge remote-tracking branch 'origin/main' into 12284-claude-wrapper-subcommands
8cc6659 fix: discover and cache Claude subcommands before hook injection
59dd108 test: cover Claude command discovery and fallback
a9da704 ci: fall back cleanly on artifact decoder errors
bfb744f test: reproduce artifact decoder failures escaping fallback
a02abe7 ci: bound the suite coverage diagnostic job
8237edc Merge main and preserve the derived review-fabric contract group
a982dec test: check review-fabric routing through the router, not its source text (manaflow-ai#13788)
0d16b9b Merge branch 'main' into ci/app-host-product-fast-transport
74b94e3 CI: read the app-host test product over parallel range requests

# Conflicts:
#	.github/workflows/ci-artifact-transport.yml
#	.github/workflows/ci-guards.yml
#	.github/workflows/ci-macos.yml
#	.github/workflows/ci.yml
#	.github/workflows/nightly.yml
#	.github/workflows/test-ios.yml
#	.github/workflows/web-complexity-trusted.yml
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