Skip to content

chore: protected-file split for 0.22.0 (release.yaml, coyote.yaml, Directory.Build.props) - #366

Merged
Chris-Wolfgang merged 1 commit into
mainfrom
protected/release-yaml-dbp-0.22.0
Aug 13, 2026
Merged

Chris-Wolfgang merged 1 commit into
mainfrom
protected/release-yaml-dbp-0.22.0

Conversation

@Chris-Wolfgang

Copy link
Copy Markdown
Owner

Protected-file split for the 0.22.0 TestKit fold (#357), per the protected-file-pr-split recipe.

#357 carries 100 files, exactly three of which are protected configuration:

file why it changed
Directory.Build.props Version centralization for the fold — Version / AssemblyVersion / FileVersion / PackageProjectUrl / LangVersion / SignAssembly / License moved here and removed from the individual csprojs.
.github/workflows/release.yaml Version-check now reads Directory.Build.props via the scoped XPath /Project/PropertyGroup/Version. Depends on the above — the two are one logical change.
.github/workflows/coyote.yaml Excludes Dispose_racing_enumeration_never_deadlocks, which crashes Coyote 1.7.11's own instrumentation. See #364.

Extracting them here lets #357 pass Detect .NET Projects on its own rather than admin-bypassing a 100-file PR.

Verification

  • Branch cut from origin/main; git diff origin/main --name-only lists only these three files.
  • All three are byte-identical to chore/fold-testkit (git diff origin/chore/fold-testkit -- <files> is empty). This PR introduces no changes of its own — it is purely a lift.
  • The protected set was confirmed against the guard's own definition in pr.yaml (the exact_files array plus the .globalconfig / .ruleset / .github/workflows/*.ya?ml pattern), not from memory.

Note on the Coyote change

Dispose_racing_enumeration_never_deadlocks is excluded, not deleted — the test body and its attribute stay in the source file, and #364 tracks restoring it.

The trigger was PR #363, which added the missing ConfigureAwait(false) to the await foreach sites in ExtractorBase and TransformerBase. That is a real fix: those packages ship net462/netstandard2.0, where a consumer with a sync context can deadlock, and every extract and transform stage inherits those two methods. CA2007 is enabled but structurally blind to await foreach, which is why it went unnoticed.

The fix changes the awaiter to ConfiguredCancelableAsyncEnumerable<T>, which Coyote 1.7.11 cannot classify — it throws a NullReferenceException inside CoyoteRuntime.IsTaskUncontrolled. It is an instrumentation crash, not a race: "Found 1 bug" on iteration #1, 1 execution path explored, 0.096 sec. 1.7.11 is the newest release on nuget.org and upstream's last commit was 2024-12-11, so there is no version to upgrade to. Reverting #363 to satisfy a dormant test tool was rejected.

Verified on chore/fold-testkit before this split was cut: Coyote systematic exploration now passes, leaving Detect .NET Projects as the only failure on #357.

This PR expects an admin bypass

It exists solely to move protected files, so it will trip the same guard by design. Merge with admin bypass, then merge main back into chore/fold-testkit; #357 should then show failing=[].

Note that admin bypass waives all ruleset rules, not just the protected-file guard — worth a glance at the other checks before merging.

Extracts the three protected configuration files from #357 so that PR can
pass the `Detect .NET Projects` guard without an admin bypass on all 100 of
its files. Contents are byte-identical to chore/fold-testkit; this PR adds
no changes of its own.

- Directory.Build.props: version centralization for the TestKit fold --
  Version/AssemblyVersion/FileVersion/PackageProjectUrl/LangVersion/
  SignAssembly/License moved here and removed from the individual csprojs.
- .github/workflows/release.yaml: version-check reads Directory.Build.props
  via the scoped XPath /Project/PropertyGroup/Version. Depends on the above
  -- the two are one logical change and must land together.
- .github/workflows/coyote.yaml: excludes
  Dispose_racing_enumeration_never_deadlocks, which crashes Coyote 1.7.11's
  own instrumentation on the ConfiguredCancelableAsyncEnumerable awaiter
  introduced by #363. See #364.

After this merges to main, main merges back into chore/fold-testkit and
#357 goes bypass-free.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings August 13, 2026 12:40

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
Chris-Wolfgang merged commit 34864d7 into main Aug 13, 2026
17 of 18 checks passed
@Chris-Wolfgang
Chris-Wolfgang deleted the protected/release-yaml-dbp-0.22.0 branch August 13, 2026 12:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants