Install any skill in seconds. Free to start, no credit card required.
Get Started Free →cmux testing rules for Swift Testing, test target compilation, test wiring, and package/refactor validation. Use when adding or changing tests, touching package/refactor code, or deciding whether reload.sh is enough validation.
.claude/skills/manaflow-ai-cmux-testing/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 29% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 109% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -55% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -57% | 0% |
A regression test for a bug fix ships as two commits so CI proves the test catches the bug:
The GitHub PR Commits tab then shows the test genuinely fails without the fix.
Test files in cmuxTests/ must be wired into cmux.xcodeproj/project.pbxproj with a matching PBXFileReference and PBXSourcesBuildPhase entry. A .swift file added without them is silently ignored by Xcode: xcodebuild test -only-testing:cmuxTests/<TestClass> and bot reviews both pass with "Executed 0 tests", so the missing wiring is indistinguishable from a clean red/green regression test until a real user hits the bug. Surfaced during https://github.com/manaflow-ai/cmux/issues/4529 against https://github.com/manaflow-ai/cmux/pull/4536.
After creating, renaming, or deleting a direct cmuxTests/*.swift file, run ./scripts/sync-test-wiring. It deterministically reconciles the PBXFileReference, PBXBuildFile, cmuxTests group child, and cmuxTests Sources membership; --check performs the same validation without writing. Foreign target membership is rejected with an explicit diagnostic. The workflow-guard-tests CI job still runs ./scripts/lint-pbxproj-test-wiring.sh as a defensive Sources-phase guard.
Resources/Info.plist, project.pbxproj, .xcconfig, source files) just to assert a key, string, plist entry, or snippet exists.Swift Testing (Swift 6 / Xcode 16) is the default for every unit and integration test: import Testing, @Test, @Suite, #expect(...), try #require(...). Do not write new import XCTest tests except UI tests.
XCUIApplication integration. Files under cmuxUITests/ keep XCTestCase; do not migrate or bridge them.Tests/<Name>Tests/ ships with it from the first commit; Xcode 16 auto-detects the framework from import Testing with no Package.swift configuration.@Test(arguments: [...]) instead of duplicate methods..serialized, not locks or sleeps.@Test(.tags(.something)) let CI and local runs filter selectively.reload.sh builds only the cmux scheme, so a green reload says nothing about whether cmuxTests/cmuxUITests still compile. A moved or renamed symbol can keep the app building while breaking the test target (real case: a write(to:atomically:) typo and a removed TabManager.CommandResult surfaced only in the tests job). Before pushing package/refactor changes, build the cmux-unit scheme with -derivedDataPath /tmp/cmux-<tag> (plus the GlobalISel workaround flag for cmuxApp/AppDelegate churn), or let the tests CI job gate it.
reload.sh, cmux-unit, GitHub Actions, E2E/UI tests, and Python socket tests.remote.tmux.pane_grids / remote.tmux.test_exec debug verbs, and the live layout fuzz harness.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 17,464 | 18,501 | +6% | 1 | 1 | 0% | 1,923 | 2,339 | +22% | 0 | 0 | — |
case-02 | fail→pass | 16,789 | 13,244 | -21% | 1 | 1 | 0% | 1,973 | 2,540 | +29% | 0 | 0 | — |
case-03 | fail→pass | 22,219 | 15,288 | -31% | 1 | 1 | 0% | 2,824 | 3,523 | +25% | 0 | 0 | — |
case-04 | fail→pass | 73,144 | 41,526 | -43% | 1 | 1 | 0% | 2,557 | 5,333 | +109% | 0 | 0 | — |
case-05 | pass→pass | 9,097 | 7,758 | -15% | 1 | 1 | 0% | 1,571 | 2,460 | +57% | 0 | 0 | — |
case-06 | pass→pass | 27,802 | 25,782 | -7% | 1 | 1 | 0% | 3,008 | 3,719 | +24% | 0 | 0 | — |
case-07 | pass→pass | 13,749 | 5,896 | -57% | 1 | 1 | 0% | 1,916 | 1,833 | -4% | 0 | 0 | — |
case-08 | pass→pass | 32,840 | 5,002 | -85% | 1 | 1 | 0% | 1,563 | 1,682 | +8% | 0 | 0 | — |
case-09 | pass→pass | 14,784 | 5,685 | -62% | 1 | 1 | 0% | 1,973 | 1,989 | +1% | 0 | 0 | — |
case-10 | pass→pass | 14,572 | 5,620 | -61% | 1 | 1 | 0% | 2,058 | 1,846 | -10% | 0 | 0 | — |
case-11 | fail→pass | 67,319 | 5,175 | -92% | 1 | 1 | 0% | 3,722 | 1,680 | -55% | 0 | 0 | — |
case-12 | fail→pass | 77,941 | 3,764 | -95% | 1 | 1 | 0% | 3,734 | 1,612 | -57% | 0 | 0 | — |
case-13 | fail→pass | 15,704 | 6,136 | -61% | 1 | 1 | 0% | 1,950 | 1,757 | -10% | 0 | 0 | — |
case-14 | fail→pass | 16,340 | 6,950 | -57% | 1 | 1 | 0% | 2,048 | 2,077 | +1% | 0 | 0 | — |
case-15 | pass→pass | 14,285 | 5,794 | -59% | 1 | 1 | 0% | 2,060 | 1,895 | -8% | 0 | 0 | — |
case-16 | pass→pass | 27,745 | 11,844 | -57% | 1 | 1 | 0% | 1,948 | 2,988 | +53% | 0 | 0 | — |
case-17 | pass→pass | 18,095 | 5,739 | -68% | 1 | 1 | 0% | 2,457 | 1,878 | -24% | 0 | 0 | — |
case-18 | pass→pass | 15,042 | 3,402 | -77% | 1 | 1 | 0% | 2,153 | 1,616 | -25% | 0 | 0 | — |
case-19 | pass→pass | 12,683 | 3,765 | -70% | 1 | 1 | 0% | 1,763 | 1,676 | -5% | 0 | 0 | — |
case-20 | pass→pass | 5,512 | 3,120 | -43% | 1 | 1 | 0% | 733 | 1,564 | +113% | 0 | 0 | — |
case-21 | fail→pass | 12,693 | 3,809 | -70% | 1 | 1 | 0% | 2,068 | 1,383 | -33% | 0 | 0 | — |
case-22 | fail→pass | 10,025 | 4,284 | -57% | 1 | 1 | 0% | 1,549 | 1,471 | -5% | 0 | 0 | — |
case-23 | pass→pass | 18,133 | 10,815 | -40% | 1 | 1 | 0% | 2,274 | 2,859 | +26% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 22 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +39 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/4/2026 | +46% |
Other measured skills in the registry, with their headline benchmark lift.