# Whole-solution CI The `v2-ci` workflow restores, builds and tests in one job so the test step uses that job's Release binaries. Restore disables parallel package work; restore and build use at most two MSBuild workers. Testing uses one MSBuild worker, disables parallel target-framework runs and loads `ci.runsettings`: one VSTest process and two xUnit collection workers with conservative scheduling. Assemblies that disable parallelization keep that setting. The workflow retains the E2E/LiveIntegration exclusions, includes SlowUnit, keeps Akka's test time factor at three, and requires at least 12,000 executed tests. Runner capacity and TRX files remain available for diagnosing failures. These limits reduce contention; they do not prove every timing failure has one cause. There are no automatic test retries or changed assertion deadlines. Gitea 1.26 supports the repository-wide `lmxopcua-v2-ci` concurrency group. Only one run is active; an active run is not cancelled, but a newer pending run may supersede an older pending run. The group does not serialize other repositories using the same host. To reproduce the bounded test leg after restore and Release build: ```bash AKKA_TEST_TIMEFACTOR=3 dotnet test ZB.MOM.WW.OtOpcUa.slnx \ --configuration Release --no-build -m:1 -p:TestTfmsInParallel=false \ --settings scripts/ci/ci.runsettings \ --filter "Category!=E2E&Category!=LiveIntegration" \ --logger trx --results-directory artifacts/trx MIN_EXECUTED=12000 bash scripts/ci/assert-not-all-skipped.sh artifacts/trx/*.trx ``` The guard uses the existing TRX `Counters/@executed` value for the aggregate floor. Its `skipped` diagnostic counts individual `Results/UnitTestResult` records whose outcome is `NotExecuted`, using the document's XML namespace. Some VSTest reports set summary `notExecuted` to zero even when these records are present. Skip records are counted per file, including repeated runs; they are not a count of unique test methods and do not affect the executed floor. For malformed XML, the diagnostic retains the old summary-counter fallback; this guard does not add XML validation to its existing gate policy. Run the deterministic script fixtures without building or running the solution: ```bash python3 scripts/ci/test-assert-not-all-skipped.py ``` Verified hosted baseline: [Gitea run 975](https://gitea.dohertylan.com/dohertj2/lmxopcua/actions/runs/975) completed successfully on 2026-10-13 for commit `76bdca90e94e814e06ef10b78271e2b492b2ba32` (merged by PR #711). Restore, Release build, README drift check, the serialized whole-solution test step, the 12,000-test floor and TRX upload all passed. The floor counted 14,630 executed tests across 62 TRX files. This baseline predates the individual skip-reporting correction; its printed zero skip diagnostic is not skip evidence.