skills/skills/compare-generations/SKILL.md
You'll typically receive two generation identifiers. Follow these steps:
tuist generate list --json to find generations on each branch.tuist generate show <id> --json for both base and head generations.Fetch each directly:
tuist generate show <base-id> --json
tuist generate show <head-id> --json
List recent generations on each branch:
tuist generate list --git-branch <base-branch> --json --page-size 1
tuist generate list --git-branch <head-branch> --json --page-size 1
Then fetch full details with tuist generate show <id> --json.
main).After fetching both generations, compare:
| Metric | What to check |
|---|---|
duration | Flag if head is >10% slower |
status | Flag if base succeeded but head failed |
cacheable_targets | Note if target count changed |
local_cache_target_hits | Compare local hit counts |
remote_cache_target_hits | Compare remote hit counts |
is_ci | Note if one is CI and the other local |
Compute cache hit rates:
(local_hits + remote_hits) / cacheable_targets * 100head_rate - base_rateIf cache hit rate dropped, the key question is: which target(s) caused the invalidation cascade?
Cache invalidation typically works like this:
dependencies hash changes.Without the module cache target detail endpoint (available via MCP), use these heuristics:
git diff between the base and head commits to see which files changed.| Cause | Description |
|---|---|
| Source changes | Files in the target's source directory were modified |
| Resource changes | Assets, XIBs, storyboards, or other resources changed |
| Build settings | Target or project build settings were modified |
| Dependency changes | An external dependency version changed |
| Info.plist changes | The target's Info.plist was modified |
| Entitlements changes | The entitlements file was modified |
| Deployment target | The minimum deployment target changed |
| Headers | Public or project headers changed |
| Project settings | Shared project-level settings changed |
Categorize the cache invalidation:
Produce a summary with:
Example:
Generation Comparison: base (gen-123 on main) vs head (gen-456 on feature-x)
Duration: 12.5s -> 28.3s (+126%) -- REGRESSION
Cache hit rate: 92% (46/50) -> 64% (32/50) (-28%) -- REGRESSION
Status: success -> success
Root cause: FoundationModule had source changes (3 files modified).
This cascaded to 14 downstream targets that depend on FoundationModule.
Cache invalidation breakdown:
- Direct changes: FoundationModule (sources changed)
- Cascade: NetworkModule, AuthModule, UIModule, + 11 others (dependency hash changed)
Recommendations:
- Consider splitting FoundationModule into smaller modules to reduce cascade impact
- The 14 cascaded targets could benefit from more granular dependency declarations
- If FoundationModule changes frequently, consider interface/implementation module splitting