Skip to content

Move the tests to xunit.v3 4 and answer reviews with Conventional Comments - #472

Merged
Reefact merged 2 commits into
mainfrom
claude/zen-keller-jcc36d
Oct 31, 2026
Merged

Reefact merged 2 commits into
mainfrom
claude/zen-keller-jcc36d

Conversation

@Reefact

@Reefact Reefact commented Oct 31, 2026 •

Copy link
Copy Markdown
Owner

Summary

This PR carries two changes:

  1. xunit.v3 4. It upgrades every test project from xunit.v3 3.2.2 to 4.0.2. xunit.v3 4 runs on Microsoft.Testing.Platform (MTP) v2, which the .NET 10 SDK no longer supports through the VSTest mode of dotnet test (build error: "Testing with VSTest target is no longer supported by Microsoft.Testing.Platform on .NET 10 SDK and later"). The PR therefore also switches dotnet test to MTP mode and moves coverage from coverlet.collector (VSTest only) to coverlet.MTP. No test source changes.
  2. Review replies. Agents now answer review feedback with Conventional Comments reply labels, through the respond-to-review skill vendored from Reefact/conventional-comments-toolkit.

Type of change

  • Bug fix
  • New feature
  • Breaking change
  • Refactoring
  • Analyzer / diagnostic change
  • Tests
  • Documentation
  • Build / CI / tooling

Changes

xunit.v3 4 and the Testing Platform (1968f5c)

  • Directory.Packages.props: xunit.v3 and xunit.v3.extensibility.core 3.2.2 → 4.0.2, xunit.runner.visualstudio 3.1.5 → 4.0.1, Verify.XunitV3 31.28.0 → 32.0.1, coverlet.collector → coverlet.MTP 10.1.0.
  • global.json: "test": { "runner": "Microsoft.Testing.Platform" }.
  • All nine test projects reference coverlet.MTP. The old IncludeAssets list is dropped because it excluded compile, and MTP's generated SelfRegisteredExtensions.cs needs the coverlet types.
  • coverage.rsp replaces coverage.runsettings as the coverage options shared by ci and sonar:
    • The workflows pass it as '@coverage.rsp'. The quotes are required: without them, PowerShell (the default shell on windows-latest) treats @ as its splatting operator.
    • It produces OpenCover output and adds Obsolete to coverlet's default attribute exclusions.
    • It uses command-line options rather than a testconfig.json. A coverlet configuration file is authoritative and turns off coverlet's default exclusions, including the one that leaves out test assemblies.
    • .gitignore gains !/coverage.rsp, since the Visual Studio template ignores *.rsp.
  • Workflows (ci, sonar, release, canary):
    • dotnet test now uses --solution / --project, because MTP mode rejects a positional path.
    • --output Detailed replaces --logger "console;verbosity=normal".
    • The coverage glob is now artifacts/coverage/**/coverage.opencover.*.xml: coverlet.MTP names the reports coverage.opencover.<timestamp>.xml, one per test project, with no GUID folder.
  • dependabot.yml: ignore Verify.XunitV3 >= 33.0.0 (see below).
  • Docs: test commands in CLAUDE.md, AGENTS.md, CONTRIBUTING.md, its French translation and the PR template; coverage description in the ci / sonar workflow pages (EN + FR).

Why Verify.XunitV3 stays on 32

Every Verify.XunitV3 release built against xunit.v3 4 (33.0.0 through 33.3.4) fails FirstClassErrors.GenDoc.UnitTests with SponsorCheck SC021. The build must declare one of: a GitHub sponsorship, a licence, or a time-bounded exemption (OpenSource, at most 12 months, renewable). That is a licensing decision for the maintainer, not routine maintenance.

32.0.1 depends on xunit.v3.extensibility.core >= 3.2.2 and works on xunit.v3 4: the 172 GenDoc tests pass. Verify does not officially support this combination, though, so the question is only postponed.

Conventional Comments review replies (6d3fb04)

  • .claude/skills/respond-to-review/SKILL.md: vendored verbatim from Reefact/conventional-comments-toolkit at commit 996a6fd.
  • AGENTS.md ("Responding to review feedback") and CLAUDE.md:
    • replies use the reply labels done / ack / disagree / thanks / note / question, replacing the free-form Resolved in <sha>;
    • agents never post decision or reviewed;
    • a blocking thread is left to its reviewer to resolve;
    • the escalation routes to @Reefact are unchanged, and AGENTS.md keeps the final word on who is mentioned and when to stop;
    • the vendored file is updated by copying a newer version over it, never by editing it locally.

Testing

  • dotnet build FirstClassErrors.sln — 0 warnings, 0 errors (Debug and Release).
  • dotnet test --solution FirstClassErrors.sln — 1054 / 1054 passed, the same count as on main with xunit 3.2.2.
  • Analyzer tests pass (FirstClassErrors.Analyzers.UnitTests) — included in the run above.
  • Coverage: dotnet test --solution FirstClassErrors.sln -c Release --no-build '@coverage.rsp' --results-directory artifacts/coverage writes 9 OpenCover reports under both bash and PowerShell 7.6. Each report measures the same modules as coverlet.collector + coverage.runsettings on main.
  • CI was all green on the pre-rebase head 05ef681: Build & test on ubuntu-latest and windows-latest, the .NET Framework 4.7.2 floor, SonarQube Cloud analysis, and every other check. History was then tidied (the PowerShell quoting fix folded into 1968f5c). The source tree of 1968f5c is identical to 05ef681; CI on the current head is pending at the time of writing.
  • Stryker full sweep with build/stryker/cli.json (test-runner: mtp) on xunit.v3 4 / MTP v2: 72 tests discovered, 507 mutants tested, 507 killed, score 100 %. The other five configurations ran only as the CI's per-PR diff mutation jobs (green).
  • Not run: the release and canary workflows (they do not run on pull requests).

Documentation

  • Public API / error documentation updated
  • README / doc/ updated — contributor test commands, the ci/sonar workflow pages, and the review-reply rules in AGENTS.md / CLAUDE.md.
  • French translation updated — CONTRIBUTING.fr.md, ci.fr.md, sonar.fr.md. No user-facing library behaviour changes.
  • No documentation change required

Architecture decisions

  • No architectural decision in this pull request
  • New decision recorded — ADR drafted as Proposed: ADR-____
  • Supersedes an existing ADR — successor proposed, status not flipped: ADR-____
  • ⚠️ Conflicts with an existing ADR — flagged for the maintainer: ADR-____

ADR check.

  • The xunit change is consistent with ADR-0043 / ADR-0046 (mutation testing): Stryker already used the MTP runner, and this PR moves the rest of the toolchain onto the same platform.
  • Whatever is decided about Verify's SponsorCheck (sponsor, claim the OpenSource exemption, or replace Verify) is a dependency/licensing policy and may deserve its own ADR.
  • The review-reply convention is an agent workflow rule rather than a product decision, so I did not draft an ADR for it.

@Reefact to judge both points.

Related issues

None.

🤖 Generated with Claude Code

https://claude.ai/code/session_019k6GsSYBeJ4fUz7QbEueQW

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-31T09:20:36.738471Z eb3cdc1 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@Reefact Reefact left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

CI Windows failure identified.

Comment thread .github/workflows/ci.yml Resolved

Reefact commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

reviewed: Windows coverage invocation fixed and all CI checks pass

Verified on 05ef681: the PowerShell response-file argument is quoted, the Windows and Ubuntu test jobs pass, the .NET Framework 4.7.2 floor passes, and the remaining CI workflows are green. The blocking review thread has been resolved; no findings remain open.

@Reefact Reefact changed the title build: move the test suites to xunit.v3 4 and the Testing Platform Move the tests to xunit.v3 4 and answer reviews with Conventional Comments Oct 31, 2026
xunit.v3 4 runs on Microsoft.Testing.Platform v2, which the .NET 10 SDK
no longer drives through the VSTest mode of `dotnet test`. global.json
opts `dotnet test` into the Testing Platform mode, so every command now
names its target with --solution or --project and logs with --output.

coverlet.collector is a VSTest data collector and stops working there.
Every test project now references coverlet.MTP, and coverage.rsp
replaces coverage.runsettings as the shared ci/sonar options: same
OpenCover format, same measured modules, one report per test project
named coverage.opencover.<timestamp>.xml.

Verify.XunitV3 stays on 32.0.1, which runs on xunit.v3 4: every 33.x
release fails the build with SponsorCheck SC021 until a sponsorship or
exemption is declared, a licensing decision left to the maintainer.
Dependabot ignores 33 and later until then.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019k6GsSYBeJ4fUz7QbEueQW
Vendor the respond-to-review skill verbatim from
Reefact/conventional-comments-toolkit (commit 996a6fd) under
.claude/skills/, and point AGENTS.md and CLAUDE.md at it. Review replies
now carry a reply label (done, ack, disagree, thanks, note, question)
instead of the free-form "Resolved in <sha>", agents never post
decision or reviewed, and a blocking thread is left to its reviewer.
The escalation routes to @Reefact are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019k6GsSYBeJ4fUz7QbEueQW
@Reefact
Reefact force-pushed the claude/zen-keller-jcc36d branch from 507f9e6 to 6d3fb04 Compare October 31, 2026 09:31

Reefact commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

reviewed: xUnit migration and review-reply rules verified

Rechecked commit 6d3fb04: the PowerShell coverage fix remains in place, all GitHub Actions checks completed successfully (including Windows, Linux, Sonar, CodeQL and mutation testing), and the existing blocking thread is resolved. The added respond-to-review skill and agent guidance introduce no outstanding findings. My review is closed for this commit.

@Reefact
Reefact merged commit 8f84258 into main Oct 31, 2026
24 checks passed
@Reefact
Reefact deleted the claude/zen-keller-jcc36d branch October 31, 2026 09:34
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