Skip to content

release: 0.10.1 (thorough-review maintenance tier + Abstractions 0.16.0) - #246

Merged
Chris-Wolfgang merged 110 commits into
mainfrom
vNext
Jul 27, 2026
Merged

release: 0.10.1 (thorough-review maintenance tier + Abstractions 0.16.0)#246
Chris-Wolfgang merged 110 commits into
mainfrom
vNext

Conversation

@Chris-Wolfgang

Copy link
Copy Markdown
Owner

Release 0.10.1 — the deferred "thorough-review" maintenance/hardening tier plus the Wolfgang.Etl.Abstractions 0.16.0 bump.

PATCH: no public API or behaviour change to either shipped package — the test doubles and contract-test base classes are unchanged. Only the Abstractions dependency floor (0.15.0 → 0.16.0) is consumer-visible. PackageValidation confirms no ABI break vs 0.10.0.

What's in it

  • Security / supply-chain CI: license audit, CycloneDX SBOM, OSSF Scorecard, Semgrep SAST, Actions audit (actionlint + zizmor, all actions SHA-pinned), build-reproducibility verification + per-release manifest, and OIDC / NuGet Trusted Publishing for the release path.
  • Test infrastructure: SourceLink step-into (F11), Native-AOT smoke, cross-platform/multi-arch differential, CsCheck fuzz suite, Coyote concurrency, per-PR perf-regression, Stryker mutation gate, XML-doc example-rot, zero-alloc guard, culture-invariance.
  • Docs: ADRs, migration-guide scaffold, worked consumer sample, reproducible-build guide, SECURITY.md release-path appendix.
  • Fixes: allocation-guard cross-platform stability; docfx.json renormalized to LF (.gitattributes eol=lf).

Closes (auto-close on merge to main)

Closes #115
Closes #116
Closes #117
Closes #124
Closes #125
Closes #126
Closes #127
Closes #128
Closes #130
Closes #132
Closes #133
Closes #134
Closes #135
Closes #136
Closes #137
Closes #138
Closes #139
Closes #140
Closes #142
Closes #143
Closes #144
Closes #145
Closes #207

Deliberately left open (N/A)

🤖 Generated with Claude Code

Chris-Wolfgang and others added 30 commits July 12, 2026 20:43
Bumps Meziantou.Analyzer from 3.0.119 to 3.0.123
Bumps Microsoft.Bcl.AsyncInterfaces from 10.0.9 to 10.0.10
Bumps Microsoft.Bcl.Memory from 10.0.9 to 10.0.10
Bumps Microsoft.SourceLink.GitHub from 10.0.300 to 10.0.301
Bumps SonarAnalyzer.CSharp from 10.28.0.143324 to 10.29.0.143774

---
updated-dependencies:
- dependency-name: Meziantou.Analyzer
  dependency-version: 3.0.123
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-dependencies
- dependency-name: Microsoft.Bcl.AsyncInterfaces
  dependency-version: 10.0.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-dependencies
- dependency-name: Microsoft.Bcl.Memory
  dependency-version: 10.0.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-dependencies
- dependency-name: Microsoft.SourceLink.GitHub
  dependency-version: 10.0.301
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dotnet-dependencies
- dependency-name: SonarAnalyzer.CSharp
  dependency-version: 10.29.0.143774
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: dotnet-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Adds sourcelink-stepinto.yaml + fixtures — a scheduled/manual workflow that
drives netcoredbg to step into TestExtractor's constructor from a scratch
consumer and asserts the debugger resolves the library's real SourceLink-mapped
source, not a decompiled placeholder.

Complements sourcelink.yaml (PR #208, the static `dotnet sourcelink test`
gate); together they satisfy #133. Ported from ETL-Transformers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds aot-smoke.yaml + a tiny console consumer that references
Wolfgang.Etl.TestKit, exercises the async-enumerable pipeline
(TestExtractor -> TestTransformer -> TestLoader) end-to-end, publishes it with
PublishAot on windows-latest, and runs the native binary. Fails the PR if the
library ever stops being AOT/trim-safe.

Consumer is isolated via empty Directory.Build.props/.targets stubs so the
throwaway fixture does not inherit library analyzer/multi-TFM policy. Ported
from D20-Dice, adapted for the async pipeline surface.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ependencies-ca9ebd494a

Bump the dotnet-dependencies group with 5 updates
ci: add SourceLink verification workflow
ci: add SourceLink step-into (F11) verification (#133)
Addresses Copilot review on #203:
- Install the same SDK list as the test stages (3.1.x-10.0.x) so the solution's
  older-TFM projects restore/build under InspectCode instead of failing or
  tripping out-of-support-TFM warnings-as-errors on a 10.0-only SDK.
- Select the solution (.slnx/.sln) BEFORE restore/build and target it
  explicitly, so restore, build, and InspectCode all use the same solution and
  the no-solution case fails with the intended message.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fleet SHA-pin migration across every workflow:
- Convert tag-pinned actions (checkout@v7, setup-dotnet@v6, upload-artifact@v7,
  download-artifact@v8.0.1, codeql-action init/analyze@v4) to full-commit-SHA
  pins with # vX comments.
- Correct the D20-ported files' stale/behind SHAs: checkout v7.0.0 -> current
  v7 (3d3c42e5), and bump setup-dotnet v5 -> v6 to match the rest of the repo.
- Add .zizmor.yml with an unpinned-uses hash-pin policy so any future tag-pin is
  flagged (must be passed via --config; wired into actions-audit.yaml).

Resolves the zizmor 'mismatched/missing version comment' findings on the CI PRs
at the source. Third-party actions (peaceiris, benchmark-action, softprops)
were already SHA-pinned.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
chore(deps): bump Wolfgang.Etl.Abstractions to 0.16.0
)

Aligns with the fleet SHA-pin migration (#219): checkout v7.0.0 -> v7,
setup-dotnet v5 -> v6, upload-artifact v4 -> v7, upload-sarif v3/v4 -> v4.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ci(pr): add ReSharper InspectCode job (canonical)
The Directory.Build.props stub blocks the repo's MSBuild analyzer policy, but
.editorconfig is discovered by directory walk-up independently, so the root
.editorconfig's CA2007 severity still applied to the throwaway consumer and
surfaced as PR check-annotation warnings on the async awaits. Add a
root=true .editorconfig so the fixture is fully exempt from repo lint.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
actionlint gates workflow YAML + embedded shell (via shellcheck); zizmor
audits for injection / over-broad permissions / unpinned actions and uploads
SARIF to Code Scanning (report-only, promote to gate once baseline clean).
Runs on every PR. Ported from D20-Dice.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#143)

Aligns with the fleet SHA-pin migration (#219): checkout v7.0.0 -> v7,
setup-dotnet v5 -> v6, upload-artifact v4 -> v7, upload-sarif v3/v4 -> v4.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds license-audit.yaml + .github/license-audit/ config. Runs nuget-license
over both packable projects (TestKit + TestKit.Xunit) on PR + push + schedule,
gating on an OSI-permissive allow-list and uploading a JSON inventory.

xunit.abstractions 2.0.3 exposes a license URL rather than an SPDX expression;
mapped to its actual license (Apache-2.0) in url-license-mappings.json. Both
projects audit clean locally. Ported from D20-Dice; matrix'd for two projects.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
#143)

Aligns with the fleet SHA-pin migration (#219): checkout v7.0.0 -> v7,
setup-dotnet v5 -> v6, upload-artifact v4 -> v7, upload-sarif v3/v4 -> v4.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds scorecard.yaml (weekly + push-to-main + branch-protection-rule) that
scores the repo against supply-chain best practices and uploads SARIF to Code
Scanning. Adds the Scorecard badge to README. Ported from D20-Dice.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
)

Aligns with the fleet SHA-pin migration (#219): checkout v7.0.0 -> v7,
setup-dotnet v5 -> v6, upload-artifact v4 -> v7, upload-sarif v3/v4 -> v4.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds semgrep.yaml running the free public registry packs (p/csharp,
p/security-audit, p/secrets) on PR + push. A different engine/ruleset from
CodeQL; uploads SARIF to Code Scanning, report-only for now. Ported from
D20-Dice.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Aligns with the fleet SHA-pin migration (#219): checkout v7.0.0 -> v7,
setup-dotnet v5 -> v6, upload-artifact v4 -> v7, upload-sarif v3/v4 -> v4.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds reproducible-build.yaml — checks the commit out to two directories, builds
both TestKit assemblies with ContinuousIntegrationBuild=true, and fails if the
.dll hashes differ (path-independent reproducibility). Adds REPRODUCIBLE-BUILD.md
documenting the guarantee + third-party verification steps. Ported from D20-Dice,
extended to both packable projects.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…d.yaml (#143)

Aligns with the fleet SHA-pin migration (#219): checkout v7.0.0 -> v7,
setup-dotnet v5 -> v6, upload-artifact v4 -> v7, upload-sarif v3/v4 -> v4.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Generates a CycloneDX SBOM of each shipped project's dependency graph on PR +
push, uploaded as an artifact (per-PR complement to release.yaml's release-time
SBOMs). Matrix'd over both packable projects. Actions SHA-pinned to current
major tags (#143). Verified locally (26 packages). Ported from D20-Dice.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ci: add Native-AOT publish+run smoke test (#132)
Chris-Wolfgang and others added 11 commits July 24, 2026 14:01
test: add Coyote systematic concurrency tests (#126)
Replaces secrets.NUGET_API_KEY with NuGet Trusted Publishing: the publish-nuget
job now adds id-token: write, exchanges the GitHub OIDC token for an ephemeral
push key via NuGet/login@v1 (SHA-pinned), and publishes with that step-output
key. No long-lived API key on GitHub or NuGet.

REQUIRES (manual, before the next release runs): a Trusted Publishing policy on
nuget.org for BOTH Wolfgang.Etl.TestKit and Wolfgang.Etl.TestKit.Xunit
(owner Chris-Wolfgang, repo ETL-Test-Kit, workflow release.yaml). Unblocks the
#140 SECURITY.md OIDC release-path appendix. Canonical shape from Etl-DbClient.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ci(release): migrate NuGet publish to Trusted Publishing / OIDC (#207)
Appends the canonical SECURITY.md appendix now that the release path is OIDC /
NuGet Trusted Publishing (#207/#239). Records the load-bearing per-repo facts a
maintainer needs during an incident: OIDC release path (no long-lived key),
no fallback, owner, known Wolfgang.* downstream consumers, and both packages'
nuget.org coordinates for unlisting. Generic incident-response steps are
intentionally not duplicated. Shape matches Etl-DbClient #240.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bumps both packages 0.10.0 -> 0.10.1 (PATCH) and adds the CHANGELOG entry. This
is the thorough-review maintenance/hardening tier + the Abstractions 0.16.0 bump;
no public API or behaviour change to the shipped code. PackageValidation baseline
stays at 0.10.0 (last published) — bump it after 0.10.1 is live on NuGet.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
docs(security): add Release path & compromise scope appendix (#140)
docs: add Architecture Decision Records (#139)
The committed blob had CRLF line endings while .gitattributes declares
'* text=auto eol=lf', so every checkout left docfx_project/docfx.json dirty.
On CI this aborted github-action-benchmark's 'git switch gh-pages' ('local
changes would be overwritten'), failing the perf-regression check on #244.
git add --renormalize rewrites the blob to LF so checkouts are clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 26, 2026 02:52

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Chris-Wolfgang added a commit that referenced this pull request Jul 26, 2026
main is ahead of vNext on Directory.Build.props (Meziantou 3.0.123→
3.0.125, SonarAnalyzer 10.29→10.30 via dependabot group bump #243).
The bundle carried vNext's older copy, which would have downgraded
those analyzers on main. Restore Directory.Build.props to main's
version so the bundle introduces zero reversions; vNext's copy is
reconciled by the main→vNext merge that clears #246's guard.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
main advanced to Wolfgang.Etl.Abstractions 0.17.0 + two analyzer bumps
(Meziantou 3.0.125, SonarAnalyzer 10.30.0.144632) via dependabot group
bump #243, merged after vNext branched. Bump vNext to match so the
vNext→main release merge (#246) neither downgrades main nor ships 0.10.1
against a stale 0.16.0. Still a PATCH: no public API/behaviour change,
PackageValidation baseline stays 0.10.0. CHANGELOG updated accordingly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment thread .github/workflows/pr.yaml Fixed
Comment thread .github/workflows/pr.yaml Fixed
Comment thread .github/workflows/pr.yaml Fixed
…njection

zizmor / code-scanning flagged the InspectCode job's restore, build, and
inspect steps for expanding ${{ steps.select-solution.outputs.sln }}
directly inside run: shell blocks (template-injection). Bind the step
output to an env var and reference $SLN in the script so the value is
never spliced into the command line. No behaviour change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Chris-Wolfgang added a commit that referenced this pull request Jul 26, 2026
Keeps the bundle's pr.yaml identical to vNext's so it stays out of #246's
protected diff after this merges. See vNext commit for rationale.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

3 participants