Release 0.23.2 - #421
Merged
Merged
Release 0.23.2#421
Conversation
The #346 mutation-test additions introduced 16 fixable InspectCode findings. Per the .DotSettings policy (fix RedundantCast/S125 in code; dismiss AccessToModifiedClosure-class per instance): - RedundantCast x9: drop the `(IProgress<string>)null!` casts in OverloadDoubleCoverageTests — each overload set has a single one-arg progress method, so `null!` resolves unambiguously (build + 9 tests confirm the ArgumentNullException behavior is unchanged). - S3241 / UnusedMethodReturnValue.Local: CallCreateProgressTimer's return is never consumed (3 call sites use it for its wiring side effect) -> make it void. - S125 x5: reword descriptive/Stryker-directive comments to drop the code-like tokens (backticks, &&, ConfigureAwait(false), trailing ;) that trip the "commented-out code" heuristic. No behavior change; the `Stryker disable once Boolean` directive stays functional. The remaining AccessToModifiedClosure/AccessToDisposedClosure/VSTHRD003 findings are structural false positives on idiomatic test code (counter closures, a test gate's TaskCompletionSource) and are dismissed per instance per the documented policy. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…n-test-cleanup chore: clear InspectCode findings in mutation-test code (#361)
Microsoft.Coyote 1.7.11 pulls System.Text.Json 8.0.0 transitively into tests/Wolfgang.Etl.Abstractions.Tests.Concurrency, which is vulnerable to CVE-2024-30105 and CVE-2024-43485 (.NET DoS). It is test-only and never shipped, but it is the sole remaining OSSF Scorecard Vulnerabilities finding. Pin an explicit 8.0.5 reference (patches both) and regenerate the lockfile. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…-test fix(security): force System.Text.Json 8.0.5 in the Coyote test project
…Sdk to 18.7.0 Adopts "newest patch, kept consistent" for the first-party Microsoft runtime packages, and fixes the existing floor drift (Abstractions was 10.0.5 while TestKit/TestKit.Xunit were 10.0.10). Shipped src floors -> 10.0.11 (Microsoft.Bcl.AsyncInterfaces, Microsoft.Bcl.Memory, Microsoft.Extensions.Logging.Abstractions, System.Threading.Channels). On net8+ these are ExcludeAssets=runtime / framework-provided, so the floor only binds down-level (net462/netstandard2.0) consumers — who now get the latest security and bug fixes by default. Cascade fixes (NU1605 package-downgrade) required by the src floor bump: - 11 examples/Net4.8 projects: direct Microsoft.Bcl.AsyncInterfaces 10.0.5 -> 10.0.11. - Abstractions.Tests.Unit: Microsoft.Bcl.Memory 10.0.10 -> 10.0.11 (it references TestKit, now >= 10.0.11). Also folded in (was #413, superseded): - Microsoft.NET.Test.Sdk: net8/9/10 slot 18.3.0 -> 18.7.0 across six test projects (older-TFM 17.13.0 blocks intentionally untouched). - Abstractions.Tests.Unit: System.Linq.AsyncEnumerable 10.0.6 -> 10.0.11. Lockfiles regenerated. Verified: solution restore clean (no downgrades); all four src packages pack with PackageValidation passing against the 0.23.1 baseline; net10.0 517/517 tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…e-floors chore(deps): bump first-party 10.0.x deps to 10.0.11 + reconcile Test.Sdk to 18.7.0
…10.32.0.713 Both are minor-version bumps and the Release (TWAE) build is clean across all TFMs — no new diagnostics to fix. The major-version analyzer bumps (Meziantou, BannedApi/PublicApi 5.x, VS.Threading 18.x) are handled separately since each may surface new rules. Touches the protected Directory.Build.props — merge via admin-bypass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…icApi/VS.Threading) - Meziantou.Analyzer 3.0.58 -> 3.0.163 - Microsoft.CodeAnalysis.BannedApiAnalyzers 4.14.0 -> 5.6.0 - Microsoft.CodeAnalysis.PublicApiAnalyzers 3.3.4 -> 5.6.0 - Microsoft.VisualStudio.Threading.Analyzers 17.14.15 -> 18.7.23 Full-solution Release (TWAE) build is clean across all TFMs — no new diagnostics surfaced, including the PublicAPI baseline analyzer (RS0016/17/36/37 still validate), so no code or baseline changes were needed. Touches the protected Directory.Build.props — merge via admin-bypass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
chore(deps): bump minor analyzers (Roslynator 4.16.1, SonarAnalyzer 10.32)
chore(deps): bump major analyzers (Meziantou 3.0.163, BannedApi/PublicApi 5.6, VS.Threading 18.7)
…ml (#386) Completes the ETL-Abstractions half of #386's phase-1 gate work. Gate change — per-module threshold in all four coverage-gate implementations (pr.yaml Stage-1 bash, Stage-2 pwsh, Stage-3 bash; scripts/build-pr.ps1): unit-test assemblies (name ends in `.Tests.Unit`) must reach >= 99%; every other assembly keeps CODECOV_MINIMUM (90). Implemented as a single raw-decimal float comparison; since floor(x) >= N <=> x >= N, src behaviour is unchanged and only the test-assembly rows get the stricter bar. release.yaml alignment (step 5): the two coverage-collecting `dotnet test` calls now pass `--settings coverlet.runsettings`, so release-time coverage instruments test assemblies the same way PR-time does. Validated: the bash and pwsh gate logic were run against a synthetic Summary.txt of boundary cases (test 99.9->pass, 99.0->pass, 98.5->fail; src 90->pass, 89.9->fail); the current real 99.9% test-assembly coverage passes. pr.yaml/release.yaml still parse as valid YAML. Touches protected pr.yaml + release.yaml — merge via admin-bypass. The repo-template back-port is deferred (ETL-Abstractions-first, per decision). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ci: enforce >=99% coverage on unit-test assemblies + release.yaml alignment (#386)
- <Version> 0.23.1 -> 0.23.2 (patch: no public API change). - CHANGELOG [0.23.2] section: Changed (10.0.11 dep floors, #415) + Internal (analyzer bumps #416/#417; >=99% test-assembly coverage gate + release.yaml coverage alignment #386/#418; test-only System.Text.Json 8.0.5 CVE #412). - PackageValidationBaselineVersion 0.23.0 -> 0.23.1 (last published) on all four src packages — the 0.23.1 baseline bump never propagated to main/vNext. Verified: all four src packages pack with PackageValidation passing against the live 0.23.1 baseline. Touches protected Directory.Build.props — merge via admin-bypass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
chore(release): 0.23.2 — version + CHANGELOG + baselines
Contributor
There was a problem hiding this comment.
BenchmarkDotNet
Details
| Benchmark suite | Current: 19af414 | Previous: 5186db0 | Ratio |
|---|---|---|---|
Wolfgang.Etl.Abstractions.Benchmarks.ExtractorBenchmarks.Extract_NoProgress(RecordCount: 1000) |
31747.629252115887 ns (± 307.12248533548643) |
33511.38164265951 ns (± 121.16583148247912) |
0.95 |
Wolfgang.Etl.Abstractions.Benchmarks.ExtractorBenchmarks.Extract_WithProgress(RecordCount: 1000) |
36185.14707438151 ns (± 235.5921771174056) |
35223.92938232422 ns (± 174.25090942486918) |
1.03 |
Wolfgang.Etl.Abstractions.Benchmarks.ExtractorBenchmarks.Extract_NoProgress(RecordCount: 100000) |
3273252.6028645835 ns (± 17394.211321406146) |
3226846.8424479165 ns (± 1713.7169739208118) |
1.01 |
Wolfgang.Etl.Abstractions.Benchmarks.ExtractorBenchmarks.Extract_WithProgress(RecordCount: 100000) |
3363203.5963541665 ns (± 2165.965021642933) |
3335411.8841145835 ns (± 2517.3013795519155) |
1.01 |
Wolfgang.Etl.Abstractions.Benchmarks.PipelineBenchmarks.FluentPipeline(RecordCount: 1000) |
29587.271809895832 ns (± 123.72935223490512) |
29808.294474283855 ns (± 131.02264257398073) |
0.99 |
Wolfgang.Etl.Abstractions.Benchmarks.PipelineBenchmarks.ManualComposition(RecordCount: 1000) |
29530.491973876953 ns (± 72.16303453346165) |
29762.065439860027 ns (± 99.2941933996938) |
0.99 |
Wolfgang.Etl.Abstractions.Benchmarks.PipelineBenchmarks.BaseClassComposition(RecordCount: 1000) |
86064.02152506511 ns (± 217.25596500751448) |
84486.51436360677 ns (± 336.75281547310556) |
1.02 |
Wolfgang.Etl.Abstractions.Benchmarks.PipelineBenchmarks.FluentPipeline(RecordCount: 100000) |
2846165.5390625 ns (± 3637.4259088223694) |
2855788.0455729165 ns (± 2140.497536501959) |
1.00 |
Wolfgang.Etl.Abstractions.Benchmarks.PipelineBenchmarks.ManualComposition(RecordCount: 100000) |
2884487.1119791665 ns (± 4978.119458379189) |
2959976.84765625 ns (± 8008.527434948032) |
0.97 |
Wolfgang.Etl.Abstractions.Benchmarks.PipelineBenchmarks.BaseClassComposition(RecordCount: 100000) |
8227686.364583333 ns (± 4040.5552524533373) |
9407115.291666666 ns (± 21711.610142582238) |
0.87 |
This comment was automatically generated by workflow using github-action-benchmark.
Contributor
There was a problem hiding this comment.
⚠️ Performance Alert ⚠️
Possible performance regression was detected for benchmark 'BenchmarkDotNet'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.50.
| Benchmark suite | Current: 91f90e5 | Previous: 5186db0 | Ratio |
|---|---|---|---|
Wolfgang.Etl.Abstractions.Benchmarks.ExtractorBenchmarks.Extract_WithProgress(RecordCount: 1000) |
62755.5666809082 ns (± 1320.8083350075422) |
35223.92938232422 ns (± 174.25090942486918) |
1.78 |
This comment was automatically generated by workflow using github-action-benchmark.
The >=99% coverage gate (#418) correctly failed the release: CI's merged report put ErrorPolicies.Tests.Unit and TestKit.Tests.Unit at 98.7%. Two causes: 1. The SDK entry point (AutoGeneratedProgram / Microsoft.NET.Test.Sdk.Program.cs) was never actually excluded — coverlet's ExcludeByFile glob doesn't match its absolute Windows NuGet-cache path. Exclude it by type name (`<Exclude>[*]AutoGeneratedProgram</Exclude>`). Takes ErrorPolicies.Tests.Unit to 100% and drops the 1-line SDK gap from every test assembly. 2. The #346 mutation-test helpers. Excluded ONLY genuinely-never-executed code, at the MEMBER level (not whole classes), so code that IS tested stays measured: - IProgressTimer stub doubles' empty Start(int){}/Dispose(){} (never called) — their StopTimer(), which IS asserted on, stays measured. - explicit IEnumerator/IEnumerable impls (IEnumerable.GetEnumerator, IEnumerator. Current, Reset) never reached through the non-generic interface — the generic GetEnumerator/MoveNext/Current that the tests DO drive stay measured. - empty-source async iterators passed to pre-cancelled operations that throw before enumerating them, so the body never runs. Partially-executed helpers (cancel-mid sources) are left measured; their unreachable trailing yields honestly remain uncovered. Result (net10.0): ErrorPolicies.Tests.Unit 100%, TestKit.Tests.Unit 99.7% — both clear the >=99% gate with only never-executed code excluded. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…rrorpolicies-coverage test(#386): raise TestKit/ErrorPolicies coverage to >=99% (unblocks the release)
This was referenced Aug 19, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
0.23.2 — patch release (no public API change). Merge after the protected-file bundle #420, so the "Detect .NET Projects" guard passes and full CI runs.
Contents (since 0.23.1)
Release mechanics
Order
0.23.2+ create the GitHub Release →release.yaml→ NuGet publish. (Held tonight per one-release-per-day; 0.23.1 shipped 2026-08-17.)🤖 Generated with Claude Code