Repository navigation
CI: run the legs a change can affect, by path class; the release PR, main and the release run everything #118
Description
Problem
Every pull request into release/2.3.0 runs the whole matrix: three test legs, Pack (with the smoke test against the packed feed and the SBOMs), and the smoke test packing its own feed. A docs-only change pays for all of it. Measured over the 11 successful runs since the prober left CI (2026-10-28 21:08 to 2026-10-29 08:21):
| Job | Median | Max |
|---|---|---|
| Test (ubuntu-latest) | 6.3 min | 7.0 |
| Test (windows-latest) | 8.5 min | 9.3 |
| Test (macos-latest) | 7.2 min | 15.2 |
| Pack | 6.2 min | 6.6 |
| Consumer smoke test | 5.7 min | 6.3 |
| Changes | 0.1 min | 0.1 |
Wall clock is 15.0 min median (12.6 to 21.4), 33 runner-minutes, because Pack and Consumer wait for the whole test matrix (#117). The Changes job skips only Pack and Consumer, and only when no listed path changed. It fails open and misses renames (#70). Nothing tells a deliberate skip from an accidental one (#71). Nothing runs the full matrix on its own schedule, or before the release publishes (#74).
Change
A change-class model, recorded as decision 113:
- Lanes. Four: Linux tests (always), Windows, macOS, and Pack plus both smoke-test modes (
pack). Over 150 runs, a Windows leg failed alone once for asrc/defect (the analyzer's code fix, CRLF, f9f64e5), and macOS never did. - Path classes. Prose (
docs/,design/, any*.mdoutsidesrc/) selects Linux, and when every path is prose the Linux leg builds and runs onlytest/Prose.slnf: Conventions, Samples, DocsQuery and Oracles tests.CHANGELOG.mdaddspack. The Analyzers and Generators select Linux, Windows and the pack, and the other run-time packages Linux and the pack.test/,spikes/and the other tools select Linux and Windows. The smoke test and its inputs, the selection tool, every build file and workflow, and any unlisted path select Linux, Windows and the pack. - Events. A PR into
release/**, or a push to one, is selected by its diff. Only a PR intomain(the release PR), a push tomain, a dispatch, the nightly and the release run macOS, and they run every lane. - Selection in
tools/CiLanes, a BCL tool (decision 92). It usesgit diff --no-renames, and a conventions test holds it to what MSBuild says the pack reads (The Changes job fails open, misses renames, and does not list tools/Shared or .config/dotnet-tools.json #70). - A gate job,
CI, over every job. It passes when the selected jobs succeeded and the others were skipped (CI: a gate job over every job, and which legs it requires #71), and it becomes the required check. - Portable file names, held by a Linux convention test before the OS legs may skip (CI: OS legs skip inert-only diffs, after a convention test for portable file names #73).
release.ymlcalls the full workflow before it verifies, and a nightly dispatches it onmainand every release branch (Release: call the full CI workflow before publishing, and a nightly full run #74).
#70, #71, #73 and #74 are the parts. This issue is the model that ties them together, and #117 is in it.
Done when
The decision record exists. One PR implements it. That PR shows a docs-only change that runs only the Linux leg, a src/ change that runs every leg, and before/after run times for both.
Activity
build: Windows only where code handles text itself, macOS only on rel…
CaffeinatedCoder commentedon Oct 29, 2026
Before and after
The same one-line change, in throwaway draft PRs. "Before" PRs went into
release/2.3.0(the old workflow), and "after" PRs intorelease/ci-lanes-demo, cut from this branch at fce2663. Wall clock runs from the first job's start to the last job's end. Runner-minutes add up every job that ran.docs/closed-sets.md)src/(src/CodoMetis.TypeKit/Fault.cs)src/: a core package change runs neither Windows nor macOS. The pack now starts beside the tests, not after them.tools/CiLanes, so Linux, Windows and the pack ran, without macOS. It took 9.3 min and 27.6 runner-minutes.An Analyzers or Generators change adds the Windows leg (about 8.5 min). A PR into
main, a push tomain, the nightly run and the release run every leg, macOS included.CaffeinatedCoder commentedon Oct 29, 2026
Done in #123, merged into
release/2.3.0as a92e5bc (decision 113). Closed by hand:Closescloses nothing on a merge into a release branch.