Optimize CI workflows with dynamic matrix and cache cleanup#129
Optimize CI workflows with dynamic matrix and cache cleanup#129
Conversation
#128) - Add concurrency groups to cancel in-progress runs on same branch - Add paths-ignore to skip CI on doc-only changes - Add pull_request trigger for PRs to main - Add configure job with dynamic matrix (minimal on feature branches, full on main/PRs) - Gate Windows builds to full matrix only - Split macOS into core (always) and full (main/PRs only) jobs - Update lint/docs conditions to run when optional jobs are skipped - Update all GitHub Actions to latest versions (checkout v6, cache v5, codecov v6, etc.) - Add cache cleanup workflows for deleted branches and closed PRs - Update CodeQL workflow action versions Closes #128, closes #126, closes #127 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## v0.0.4 #129 +/- ##
==========================================
- Coverage 78.16% 78.04% -0.12%
==========================================
Files 126 126
Lines 5651 4555 -1096
==========================================
- Hits 4417 3555 -862
+ Misses 1234 1000 -234
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
CI Workflow ReviewOverall this is a well-structured PR. The dynamic matrix, concurrency groups, and cache cleanup are all solid improvements. A few issues worth addressing. Bugs / Correctness Issues1. All other matrix jobs ( 2.
If the intent is "core macOS always runs regardless", that's a valid design — just worth a comment in the YAML to make it look intentional rather than an oversight. 3. In if: ${{ !contains(github.event.head_commit.message, 'ci skip') }}For Minor Issues4. Unnecessary Both 5. run: sudo xcode-select -s /Applications/Xcode_16.4.app/Contents/DeveloperIf the 6. Unlike Positive Highlights
|
.github/workflows/SyntaxKit.yml
Outdated
| - type: macos | ||
| runs-on: macos-15 | ||
| xcode: "/Applications/Xcode_26.0.app" |
.github/workflows/codeql.yml
Outdated
| uses: actions/checkout@v6 | ||
|
|
||
| - name: Setup Xcode | ||
| run: sudo xcode-select -s /Applications/Xcode_16.4.app/Contents/Developer |
There was a problem hiding this comment.
update to Xcode 26.4 and macOS 26
|
You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool. What Enabling Code Scanning Means:
For more information about GitHub Code Scanning, check out the documentation. |
- Ubuntu matrix: add Swift 6.2 and 6.3, remove nightly versions; use 6.3 as single-version for feature branches - build-macos: keep SPM-only; move macOS Build to build-macos-full - build-macos-full: add macOS Build with Xcode 26.4; update iOS/watchOS/tvOS/visionOS to Xcode 26.4 / osVersion 26.4 - Add build-android and build-wasm jobs (full-matrix only) - Update lint and docs needs to include new jobs - codeql.yml: update runner to macos-26, Xcode to 26.4 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
PR Review: Optimize CI workflows with dynamic matrix and cache cleanup Overall this is a solid improvement to the CI infrastructure. The dynamic matrix approach, concurrency groups, and cache cleanup are all well-designed. A few items worth addressing: BUGS / CORRECTNESS ISSUES
Both cleanup-caches.yml and cleanup-pr-caches.yml include actions/checkout@v6, but the scripts only use GitHub API calls via github-script and do not read any repo files. The checkout is wasted I/O and slightly expands the attack surface on delete/closed events.
The container line still references matrix.swift.nightly, but the new dynamic matrix never sets a nightly field. This always evaluates the fallback branch — dead code. Simplify to format('swift:{0}-{1}', matrix.swift.version, matrix.os) to avoid confusion.
SyntaxKit.yml skips doc-only changes via paths-ignore, but codeql.yml has no such filter. A commit touching only .md files or Docs/ will skip the main build but still trigger full CodeQL analysis on macOS runners (expensive). DESIGN / CONSISTENCY
build-macos still uses old-style string syntax for the ci-skip check while all other jobs use expression syntax dollar-brace notation. Minor but inconsistent.
On feature branches, four of the six declared needs are skipped. The !failure() condition correctly prevents blocking, but lint and docs still wait until GitHub resolves all six dependency slots. A dedicated gate job or trimming the needs list would let these run earlier on feature branches.
All other matrix jobs (build-windows, build-macos-full) set fail-fast: false. build-ubuntu omits this, so a single matrix job failure cancels the rest of the Ubuntu matrix. Worth making consistent. MINOR / INFORMATIONAL
The boilerplate comment "Run, Build Application using script" is left on the step that simply runs swift build. Should be updated or removed.
github.event.head_commit.message is not reliably populated on pull_request events. Minor in practice but worth a comment in the workflow. WHAT IS WELL DONE
|
- configure outputs separate ubuntu-os/swift/type arrays (matching MonthBar pattern) - build-ubuntu composes matrix from all three outputs; wasm/wasm-embedded types use swift:6.3-noble container; type and wasmtime-version: 41.0.3 passed to swift-build - Remove separate build-wasm job - Android: add swift 6.3 alongside 6.2, add free-disk-space step, android-swift-version/android-api-level/android-run-tests parameters, coverage upload Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- configure: guard ci-skip check with event_name check so it always runs on pull_request events (github.event.head_commit is null on PRs) - build-macos: add needs: [configure], gate on configure success so ci-skip propagates via dependency chain instead of re-checking head_commit.message Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The swift:6.3 Docker image does not include curl, which is required by the Codecov uploader. Applies to all 6.3 builds including wasm types. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
PR Review: Optimize CI workflows with dynamic matrix and cache cleanup Overall this is a solid improvement. The dynamic matrix, concurrency groups, and cache cleanup are all good additions. A few issues worth addressing: BUGS / POTENTIAL FAILURES
build-ubuntu runs sersoft-gmbh/swift-coverage-action@v5 with fail-on-empty-output: true for all matrix entries, including wasm and wasm-embedded types. WASM builds do not produce LLVM coverage data in the standard way, so these jobs will always fail at the coverage step. The coverage and Codecov upload steps should be conditional on matrix.type being empty.
build-ubuntu is the only multi-entry matrix job without fail-fast: false. On a full matrix run this is 2 OS x 4 Swift versions x 3 types = 24 combinations. A single wasm failure (see point 1 above) would cancel all 23 other builds. All sibling jobs (build-windows, build-macos-full, build-android) already have fail-fast: false set. INCONSISTENCIES
The configure job correctly guards the null case by first checking whether event_name equals pull_request. The lint and docs jobs lack this guard. On pull_request events, github.event.head_commit is null. The contains(null, 'ci skip') expression evaluates to false in GHA so it does not cause failures, but it is inconsistent with the configure job pattern and could mislead future maintainers. MINOR ISSUES
Both cleanup-caches.yml and cleanup-pr-caches.yml include an actions/checkout@v6 step, but the jobs only make GitHub API calls via github-script and never read repository files. These checkout steps can be removed.
codeql.yml has no paths-ignore, so it triggers on every non-WIP push including documentation-only changes. Consider adding the same paths-ignore as SyntaxKit.yml. CodeQL also currently runs on every non-WIP branch rather than just main and PRs, which may be broader than intended given the dynamic matrix optimization goals. SUMMARY OF ACTIONABLE ITEMS
Generated with Claude Code |
CI Workflow ReviewOverall this is a solid improvement — the dynamic matrix, concurrency groups, and cache cleanup workflows all address real pain points. A few issues worth addressing before merge: Bugs1. lint / docs jobs: head_commit.message is null on pull_request events github.event.head_commit is null on pull_request events — the configure job already handles this correctly with its event_name == 'pull_request' guard, but lint and docs still have the raw head_commit.message check. On a PR this evaluates to !contains(null, 'ci skip') which is true (so it won't silently skip CI), but it's fragile and inconsistent. Consider mirroring the configure guard: if: !cancelled() && !failure() && (github.event_name == 'pull_request' || !contains(github.event.head_commit.message, 'ci skip')) 2. build-windows matrix: include entries without matching base keys create orphaned jobs Because swift-version doesn't appear in the base matrix dimensions (only runs-on does), none of the include entries match any existing combination — GitHub Actions adds them as standalone jobs with no runs-on value. The base 2 jobs (windows-2022, windows-2025) also get no swift-version. This was a pre-existing bug but the PR adds a third entry, making it worse. The likely intent is a 2D matrix (runs-on x swift-version), or each include entry should also specify runs-on. Performance / Correctness3. WASM container hardcoded to swift:6.3-noble across all Swift versions In the full matrix, ubuntu-type is ["","wasm","wasm-embedded"] combined with all 4 Swift versions (6.0–6.3). WASM builds for Swift 6.0, 6.1, and 6.2 will all run inside the swift:6.3-noble container — likely producing failures or misleading results. Either restrict WASM to only Swift 6.3 in configure, or parameterize the container image per Swift version. Minor4. codeql.yml missing paths-ignore on pull_request The main workflow skips doc-only PRs via paths-ignore, but codeql.yml doesn't have this on the pull_request trigger. A docs-only PR will still trigger a ~2h CodeQL scan on macos-26. 5. build-macos flags reference undefined matrix.type matrix.type isn't in the build-macos matrix (only the single SPM entry), so the flags expression always evaluates to 'spm'. Works correctly but is confusing — safe to simplify to: flags: spm Positive notes
|
- Add version branch pattern to pull_request trigger so PRs targeting v0.0.4 (and similar) fire the full matrix CI - Use github.head_ref || github.ref_name for concurrency group so push and pull_request events for the same branch share a group; PR run (arrives second) cancels the concurrent push run Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PR Review: Optimize CI workflows with dynamic matrix and cache cleanupOverall this is a solid improvement — the concurrency groups, dynamic matrix, cache cleanup workflows, and CodeQL integration are all well-designed. Here are a few items worth addressing before merging: 🐛 Potential Bugs1. Windows matrix In This pattern was present before the PR (2 includes + 2 matrix:
include:
- runs-on: windows-2022
swift-version: swift-6.3-release
swift-build: 6.3-RELEASE
- runs-on: windows-2025
swift-version: swift-6.3-release
swift-build: 6.3-RELEASE
# ... etc2. WASM builds will fail coverage step In
|
Settings.projectRoot now uses a 3-strategy fallback matching the SyndiKit pattern: working directory first (reliable for WASM/Android/SPM), then #filePath-relative (macOS/Linux CI), then walking up parent directories. Add android-copy-files to copy Documentation.docc to the Android emulator's working directory so the path resolution finds the files via Strategy 1. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
CI Workflow ReviewOverall this is a well-structured overhaul with solid improvements. A few issues worth addressing before merge. Bugs / Logic Issues1. lint and docs jobs run even when ci skip is in commit message When a push has 2. WASM container hardcoded regardless of matrix OS/Swift version The WASM container is hardcoded to Minor Issues3. build-macos coverage step is missing fail-on-empty-output
4. Windows matrix include items are standalone rows, not a cross-product The Windows matrix combines 5. Magic constant 4 in Settings.swift Strategy 3 The loop 6. android-copy-files path is fragile
Positives
Overall the concurrency, dynamic matrix, and cache-cleanup pieces are solid. Issue 2 (hardcoded WASM container) is the most impactful to address before merge. |
Examples/ (2.1MB) and full Documentation.docc (with images) exceed WASM memory constraints. On WASI, use only the two lightweight tutorial .md files (~36KB total). Matches SyndiKit's #if os(WASI) subset pattern. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add Strategy 1b to Settings.projectRoot: detect Documentation.docc/ in working dir (android-copy-files copies last component only) - Add #if os(Android) branch to docPaths with prefix-less paths matching the flat copy layout on Android devices - Add id: build to swift-build steps and gate coverage upload/processing on steps.build.outputs.contains-code-coverage == 'true' across all jobs Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PR Review: Optimize CI workflows with dynamic matrix and cache cleanupThis is a well-structured PR that meaningfully improves CI efficiency. Here is my review: Strengths
Issues1. On 2. WASM type hard-codes Swift 6.3 container regardless of The container expression pins WASM/WASM-embedded to 3.
4. The autobuild step echoes "Run, Build Application using script" which is verbatim from the CodeQL starter template and adds noise to CI logs. The echo can be removed, leaving just 5. Windows matrix does not create a cross-product (pre-existing, informational) GitHub Actions
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PR Review: Optimize CI workflows with dynamic matrix and cache cleanupOverall this is a solid improvement — the concurrency groups, dynamic matrix, and cache cleanup all add real value. A few things worth addressing before merging. Issues1. WASM matrix generates redundant jobs (medium)In container: ${{ (matrix.type == 'wasm' || matrix.type == 'wasm-embedded') && 'swift:6.3-noble' || ... }}So all 8 # In configure step, for full matrix:
echo 'ubuntu-os=["noble","jammy"]' >> "$GITHUB_OUTPUT"
echo 'ubuntu-swift=[{"version":"6.0"},{"version":"6.1"},{"version":"6.2"},{"version":"6.3"}]' >> "$GITHUB_OUTPUT"
echo 'ubuntu-type=[""]' >> "$GITHUB_OUTPUT"
# And add a separate wasm-specific output, or use matrix exclusionsAlternatively, use 2. Unnecessary checkout in cache cleanup workflows (minor)Both - uses: actions/checkout@v6The 3. CodeQL autobuild step has misleading comment (minor)In - run: |
echo "Run, Build Application using script"
swift buildThe echo suggests a script will run but it's just 4.
|
Code Review: Optimize CI workflows with dynamic matrix and cache cleanupSummary: Significant CI improvement. The dynamic matrix, action version updates, and cache cleanup workflows are all solid additions. A few issues worth addressing before merge. Findings 1. The if (context.payload.ref_type !== 'branch') {
console.log('Not a branch deletion, skipping.');
return;
}2. WASM builds always use Swift 6.3 container regardless of matrix version In container: ${{ (matrix.type == 'wasm' || matrix.type == 'wasm-embedded') && 'swift:6.3-noble' || ... }}This means WASM builds silently ignore 3. On full-matrix runs, 4.
5. Original The original matrix had Minor / Style
Overall: The structure is a clear improvement. The tag-deletion guard in |
Code Review: Optimize CI workflowsWell-structured improvement. Dynamic matrix, concurrency cancellation, and cache cleanup are all good additions. A few things worth verifying: Windows matrix - include items without runs-on The include objects in the Windows matrix have no runs-on key, so per GitHub Actions docs they create new matrix combinations rather than extending existing ones. The new combinations have no runner (matrix.runs-on is undefined), which likely causes them to silently fail or skip. This is pre-existing behavior but worth auditing — if the intent is every swift version on every runner, the include items should specify runs-on or the matrix should be restructured as a full cross-product. build-macos slim job references undefined matrix keys The slim macOS matrix only defines runs-on and xcode, but the build step still passes matrix.type, matrix.deviceName, matrix.osVersion, and matrix.download-platform to swift-build. These will be empty strings. If the action handles empty strings gracefully this is fine, but removing unused with: keys would reduce confusion. lint job head_commit.message on PRs github.event.head_commit is null on pull_request events, so contains(null, 'ci skip') is false and lint correctly runs. This works, but matching the configure job's pattern of github.event_name == 'pull_request' || !contains(...) would make the intent clearer. Positives:
|
1.4.6 adds .gitattributes for symlinks on Windows, fixing build failures where symlinked plugin source files were checked out as plain text, causing 'cannot find Lock in scope' and related errors. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
On Android, Documentation.docc is copied flat to the working directory without the Sources/SyntaxKit/ prefix. Centralize the prefix logic in resolveFilePath so test methods use short paths and Settings adds the prefix for non-Android platforms. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PR Review: Optimize CI workflows with dynamic matrix and cache cleanupGood overall direction — the dynamic matrix, concurrency groups, and cache cleanup are all solid improvements. A few issues worth addressing before merge: Bugs1. Windows matrix is likely misconfigured ( The strategy:
fail-fast: false
matrix:
runs-on: [windows-2022, windows-2025]
include:
- runs-on: windows-2022
swift-version: swift-6.3-release
swift-build: 6.3-RELEASE
# ... etcOr use a proper 2. Both jobs still use: if: ${{ !cancelled() && !failure() && !contains(github.event.head_commit.message, 'ci skip') }}
if: ${{ !cancelled() && !failure() && (github.event_name == 'pull_request' || !contains(github.event.head_commit.message, 'ci skip')) }}3. Cache cleanup processes tag deletions as branches ( The if (context.payload.ref_type !== 'branch') {
console.log('Not a branch deletion, skipping.');
return;
}Minor Issues4.
if: ${{ !cancelled() && needs.configure.result == 'success' && needs.configure.outputs.full-matrix == 'true' }}5. WASM builds use a hardcoded Swift version regardless of matrix ( When 6. CodeQL lacks The main CI workflow skips doc-only changes via Positive Notes
🤖 Generated with Claude Code |
- Fix Windows matrix to use proper cross-product (runs-on × swift) instead of mismatched include entries - Fix lint/docs if conditions to guard against null head_commit on PR events - Fix cache cleanup to skip tag deletions (only process branch deletes) - Add cancellation guard to build-macos-full - Remove hardcoded swift:6.3-noble container for WASM builds; use matrix version - Add paths-ignore to CodeQL to skip doc-only commits Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PR Review: CI/CD Workflow Optimization (#129)This is a well-structured PR with meaningful improvements to CI efficiency. Below is a detailed review. SummaryThe dynamic matrix approach is excellent — feature branches now run ~4 jobs vs. 10+ on main, a 60-75% reduction in compute. The concurrency controls and cache cleanup workflows are solid additions. However, there are a few issues that should be addressed before merging. Critical Issues1. Undefined matrix variables in In Either define these variables in the matrix or remove the references if they're unused. 2. Android path assumptions in
High Severity3. The flag 4. Hardcoded Xcode version in
Medium Severity5. No timeout on The Android build job has no 6. Cache key scoping The Mint cache uses Positive Notes
Test Coverage Observations
Suggested Priority Before Merge
Overall this is a solid CI improvement. The dynamic matrix pattern is the right call for a project of this scale. Addressing the |
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
swift-docc-plugin 1.4.6 is incompatible with Swift 6.1 on Windows (missing Lock, SnippetExtractor, ParsedSymbolGraphArguments types). Windows matrix now covers 6.2 and 6.3 only. WASM/wasm-embedded tooling does not support Swift 6.0 or 6.1 on Ubuntu, so those combinations are excluded from the build matrix. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PR Review: Optimize CI workflows with dynamic matrix and cache cleanupOverall this is a solid CI improvement. The dynamic matrix, concurrency cancellation, and cache cleanup additions are all good engineering. Here are my observations: Bugs / Correctness Issues1.
if: ${{ !cancelled() && needs.configure.result == 'success' }}But if: needs.configure.outputs.full-matrix == 'true'If the intent is for 2. Potential double-prefix for WASI In let resolvedPath = "Sources/SyntaxKit/" + filePathBut the WASI "Sources/SyntaxKit/Documentation.docc/Tutorials/Quick-Start-Guide.md"If these paths are ever passed through 3. if: ${{ github.event_name == 'pull_request' || !contains(github.event.head_commit.message, 'ci skip') }}On if: ${{ github.event_name == 'pull_request' || !contains(github.event.head_commit.message, 'ci skip') }}...or adding a comment explaining why this works correctly even when Improvements & Observations4. Coverage flag bug fix — good catch Old: This was a silent bug where coverage flags were being uploaded as 5. Hardcoded android-copy-files: Sources/SyntaxKit/Documentation.doccThis hardcodes the source path. If the package structure changes this path would silently break the Android test's file access. A comment here noting the coupling with 6. Nightly Swift builds removed from Ubuntu matrix The old matrix included nightly builds ( 7. Both 8. The PR bumps to Settings.swift ArchitectureThe 3-strategy fallback in
Summary
The PR is in good shape. The WASI double-prefix concern is the most actionable item to verify before merge. |
swift-docc-plugin 1.4.6 added .gitattributes to mark symlink files, but git on Windows also needs core.symlinks=true to create real symlinks rather than plain-text stubs. Without it, SPM checks out the plugin's shared source files as text, causing 'cannot find Lock in scope' and related errors. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
PR Review: Optimize CI workflows with dynamic matrix and cache cleanup Overall this is a solid, well-structured CI overhaul. The dynamic matrix strategy, concurrency groups, and cache cleanup workflows are all good patterns. A few issues worth addressing before merge: ISSUES 1. build-android missing coverage file processing step build-ubuntu uses sersoft-gmbh/swift-coverage-action to locate coverage files and passes them explicitly to Codecov. build-android skips this step and uploads without a files: parameter, relying on Codecov auto-discovery. This may silently produce empty or missing coverage reports for Android. 2. paths-ignore inconsistency between triggers The push trigger ignores .github/ISSUE_TEMPLATE/** but the pull_request trigger does not. Minor, but worth aligning by adding .github/ISSUE_TEMPLATE/** to pull_request paths-ignore as well. 3. build-windows missing !cancelled() guard build-macos and build-macos-full both check !cancelled(), but build-windows does not. If configure is cancelled mid-run, build-windows could error rather than being skipped cleanly. Suggest adding !cancelled() && for consistency. PRE-EXISTING ISSUE (not introduced here, but worth noting) The build-macos and build-macos-full jobs run sersoft-gmbh/swift-coverage-action without an id:, so the output files list is never referenced in the Codecov upload step. macOS coverage is therefore auto-discovered. This predates this PR but could be cleaned up in a follow-up. POSITIVES
Generated with Claude Code (https://claude.com/claude-code) |
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PR Review: CI Workflow OptimizationOverall this is a solid, well-thought-out PR. The dynamic matrix, concurrency cancellation, and cache cleanup are all good additions. A few issues worth addressing: Bugs / Correctness Issues1. Both cleanup workflows include 2. - run: |
echo "Run, Build Application using script"
swift buildThe 3. needs: [build-ubuntu, build-macos, build-windows, build-macos-full, build-android]
if: ${{ !cancelled() && !failure() && ... }}On feature branches, Minor / Nits4. type: ${{ matrix.type }}The 5. // Strategy 1b: Documentation.docc copied as last component (Android flat copy)
if FileManager.default.fileExists(atPath: workingDir.appendingPathComponent("Documentation.docc").path) {
return workingDir
}This will silently match any directory that happens to contain 6. The 7. Action version pinning All actions are pinned to major version tags (e.g. What's Good
🤖 Generated with Claude Code |
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove unnecessary checkout steps from cleanup workflows - Remove template echo from codeql.yml build step - Add comments to lint/docs jobs explaining !failure() intent - Clarify empty matrix.type in build-macos - Improve Settings.swift comments for Strategy 1b and os(Android) - Update all swift-build references from branch ref to v1.5.3 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Summary
paths-ignoreandpull_requesttrigger to skip CI on doc-only changesconfigurejob with dynamic matrix — minimal builds on feature branches (Ubuntu noble + Swift 6.1, core macOS only), full matrix on main/PRs-to-mainCloses #128, closes #126, closes #127
Test plan
🤖 Generated with Claude Code
Perform an AI-assisted review on