Hive
Module cache serves an unresolvable ArgumentParser xcframework — breaks app Test on unchanged source
GitHub issue · Open
Source
tuist/tuist #11489
Updated
Jun 25, 2026
Domains
Cache
Summary
The shared module (binary) cache is serving a broken ArgumentParser xcframework that fails Swift module resolution. Any cache-on build that pulls it fails with:
error: unable to resolve module dependency: 'ArgumentParser' (in target 'TuistApp' from project 'TuistApp')
Testing cancelled because the build failed.
** TEST FAILED **
This breaks app.yml’s Test job (tuist test TuistApp) on otherwise-passing, unchanged source, and will hit any other PR/branch that pulls the same cached binary (the cache is content-keyed and shared).
Impact
- The app Test job fails for
app/-touching PRs even when the source is green — a hard CI block, not a flake. - Persistent: re-running the job and rebasing onto latest
mainboth fail identically. - Shared blast radius: because the cache key is content-based, every consumer pulling the cached
ArgumentParseris affected, not a single branch.
Evidence
- Same commit, different result:
75a732f60passed on 06-24 12:45 and fails 06-25 03:07+. Both runs pull a cachedArgumentParser— the cached artifact changed/broke between those times; the source did not. - Cold-cache proves the cache is the sole cause: running the test build from source (
tuist test TuistApp --no-binary-cache) is green (21 tests, 0 failures, “Test Succeeded”). Cache-on fails with theArgumentParserresolution error. - Build / Device Build pass while Test fails, even though all three pull the same cached
ArgumentParser— the test build is the one whose module-resolution path trips on the broken xcframework (missing/unresolvable module map). - Not re-warmed by app runs:
app.ymlhas notuist cachestep (its jobs only read the cache), and the passing run uploaded0cache artifacts — so the bad entry is untouched and won’t self-heal from PR builds.
Likely cause (by timing)
- The cache is warmed by
cli.yml’s Cache job (tuist cache, pinned CLI4.201.0-canary.13) onmain. The last warm was 06-24 16:06 (Cache job succeeded). The breakage entered the cache in the 06-24 12:45 → 06-25 03:07 window. - Two PRs merged to
mainon 06-24 afternoon, both touching cache xcframework packaging — prime suspects:- #11472
fix(cli): exclude module-map xcframework headers from search paths(+ backport #11482) - #11474
feat(cli): parallelize XCFramework creation during cache warm
- #11472
- The warm is deterministic (pinned CLI + unchanged third-party dep), so re-warming reproduces the same broken binary under the same hash — it will not self-heal.
Suggested fix
- Actively evict the bad entry — bump the module-cache version, or purge the
ArgumentParserartifact — then re-warm. - Confirm #11472 / #11474 aren’t producing xcframeworks that lack a resolvable module map (this is what manifests as
unable to resolve module dependency).
Related
Same module-cache reproducibility class as the bundle-size flap in #11488; this is the hard-failure manifestation (broken module resolution) rather than the size variance.
No GitHub comments yet.