From 9a83de4e2c8176cf6249d65c952e2edeff7107d1 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Fri, 25 Sep 2026 08:53:29 -0700 Subject: [PATCH 1/5] Remove Version Literals and SHAs From WORKFLOW.md Rewrites the two coverage-extension passages that named the Microsoft.Testing.Extensions.CodeCoverage minimum version and the xunit.v3 version directly (D1.2's narrative and the D1 evidence-table line), pointing to Directory.Packages.props as the source of truth instead. Follows the fleet-wide rule that AGENTS.md, GOVERNANCE.md, CODESTYLE.md, and WORKFLOW.md carry no three-part version or commit SHA literal, naming the manifest that holds a minimum version rather than the number itself. Co-Authored-By: Claude Opus 5.5 (1M context) --- WORKFLOW.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/WORKFLOW.md b/WORKFLOW.md index b96cda1b..86d42467 100644 --- a/WORKFLOW.md +++ b/WORKFLOW.md @@ -343,13 +343,14 @@ Each is a **MUST**, stated as input -> output plus the failure it prevents. same path and the last to finish overwrites the rest. The `.cobertura.xml` default it writes instead is a name `codecov-cli`'s own file finder does not match (its patterns are `*coverage*.*` and an exact `cobertura.xml`), so the step prefixes each report to `coverage-.cobertura.xml`, keeping the guid that - makes it unique. The extension is pinned at or above **18.9.0**, for two reasons rather than one. Below - 18.1.0 it is built against Microsoft.Testing.Platform 1.x, so an 18.0.x resolution throws a - `TypeLoadException` against the 2.x platform xunit.v3 4.0.0 carries, runs zero tests, and still writes a + makes it unique. The extension is pinned at or above the minimum version `Directory.Packages.props` + declares, for two reasons rather than one. Below an earlier release in that line it is built against + Microsoft.Testing.Platform's older major version, so resolving one of those earlier releases throws a + `TypeLoadException` against the newer platform xunit.v3 carries, runs zero tests, and still writes a well-formed Cobertura file reporting full coverage, leaving only the non-zero exit to say the run reported - nothing. 18.9.0 is then the first release on Microsoft.Testing.Platform 2.3.x, where every test project - writes into the one shared `--results-directory` the invocation names rather than resolving that relative - path per project, which is what the rename loop's glob depends on. + nothing. The pinned minimum is then the first release on the newer platform's own later minor line, where + every test project writes into the one shared `--results-directory` the invocation names rather than + resolving that relative path per project, which is what the rename loop's glob depends on. - **D1.3 Lint enforces the editor checks in CI.** Output: `validate-task`'s `lint` job runs CSharpier check, `dotnet format style --verify-no-changes`, `markdownlint-cli2`, `cspell` on the user-facing docs (README, HISTORY), `ruff` and `mypy` over the `RegressionTests` Python tooling, `actionlint` (which shellchecks every @@ -525,7 +526,7 @@ Read the workflow files plus `version.json` and assert the fact behind each appl `test.runner = Microsoft.Testing.Platform`, the unit-test step passes `--coverage --coverage-output-format cobertura` with no `--coverage-output`, and prefixes each report to `coverage-.cobertura.xml` before the upload reads the directory; - `Directory.Packages.props` pins `Microsoft.Testing.Extensions.CodeCoverage` at 18.9.0 or above; + `Directory.Packages.props` pins `Microsoft.Testing.Extensions.CodeCoverage` at a minimum version; `lint` runs CSharpier, `dotnet format style`, markdownlint, cspell on README/HISTORY, ruff, mypy, actionlint, editorconfig-checker; the aggregator `needs:` both and blocks on non-success. From 16a5a47a1193770665af3cd1657b4885e9674051 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Fri, 25 Sep 2026 09:08:23 -0700 Subject: [PATCH 2/5] Anchor the Coverage Extension Floor to the Testing Guidance Answers Copilot and CodeRabbit on #998: the text names the compatibility floor the fleet's dotnet-codestyle testing guidance defines, which Directory.Packages.props pins at or above, states the two failure modes plainly, and the 5A audit compares the pin with that floor. Co-Authored-By: Claude Opus 5.5 (1M context) --- WORKFLOW.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/WORKFLOW.md b/WORKFLOW.md index 86d42467..1c1483d5 100644 --- a/WORKFLOW.md +++ b/WORKFLOW.md @@ -343,14 +343,13 @@ Each is a **MUST**, stated as input -> output plus the failure it prevents. same path and the last to finish overwrites the rest. The `.cobertura.xml` default it writes instead is a name `codecov-cli`'s own file finder does not match (its patterns are `*coverage*.*` and an exact `cobertura.xml`), so the step prefixes each report to `coverage-.cobertura.xml`, keeping the guid that - makes it unique. The extension is pinned at or above the minimum version `Directory.Packages.props` - declares, for two reasons rather than one. Below an earlier release in that line it is built against - Microsoft.Testing.Platform's older major version, so resolving one of those earlier releases throws a - `TypeLoadException` against the newer platform xunit.v3 carries, runs zero tests, and still writes a - well-formed Cobertura file reporting full coverage, leaving only the non-zero exit to say the run reported - nothing. The pinned minimum is then the first release on the newer platform's own later minor line, where - every test project writes into the one shared `--results-directory` the invocation names rather than - resolving that relative path per project, which is what the rename loop's glob depends on. + makes it unique. `Directory.Packages.props` pins the extension at or above the compatibility floor the + fleet's `dotnet-codestyle` testing guidance defines, for two reasons rather than one. An older release + built against the Microsoft.Testing.Platform major version before the one xunit.v3 carries throws a + `TypeLoadException`, runs zero tests, and still writes a well-formed Cobertura file reporting full + coverage, leaving only the non-zero exit to say the run reported nothing. And the floor is the first + release where every test project writes into the one shared `--results-directory` the invocation names + rather than resolving that relative path per project, which is what the rename loop's glob depends on. - **D1.3 Lint enforces the editor checks in CI.** Output: `validate-task`'s `lint` job runs CSharpier check, `dotnet format style --verify-no-changes`, `markdownlint-cli2`, `cspell` on the user-facing docs (README, HISTORY), `ruff` and `mypy` over the `RegressionTests` Python tooling, `actionlint` (which shellchecks every @@ -526,7 +525,8 @@ Read the workflow files plus `version.json` and assert the fact behind each appl `test.runner = Microsoft.Testing.Platform`, the unit-test step passes `--coverage --coverage-output-format cobertura` with no `--coverage-output`, and prefixes each report to `coverage-.cobertura.xml` before the upload reads the directory; - `Directory.Packages.props` pins `Microsoft.Testing.Extensions.CodeCoverage` at a minimum version; + `Directory.Packages.props` pins `Microsoft.Testing.Extensions.CodeCoverage` at or above the compatibility + floor the `dotnet-codestyle` testing guidance defines; `lint` runs CSharpier, `dotnet format style`, markdownlint, cspell on README/HISTORY, ruff, mypy, actionlint, editorconfig-checker; the aggregator `needs:` both and blocks on non-success. From 952632ca31f4134d9e7bb322e26864b58bddb90b Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Fri, 25 Sep 2026 09:19:17 -0700 Subject: [PATCH 3/5] Split the Coverage Floor Explanation Into Short Sentences Answers Copilot on #998: the 41-word sentence is split under the fleet's 25-word sentence guidance, keeping both failure modes. Co-Authored-By: Claude Opus 5.5 (1M context) --- WORKFLOW.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/WORKFLOW.md b/WORKFLOW.md index 1c1483d5..87950de9 100644 --- a/WORKFLOW.md +++ b/WORKFLOW.md @@ -344,12 +344,12 @@ Each is a **MUST**, stated as input -> output plus the failure it prevents. a name `codecov-cli`'s own file finder does not match (its patterns are `*coverage*.*` and an exact `cobertura.xml`), so the step prefixes each report to `coverage-.cobertura.xml`, keeping the guid that makes it unique. `Directory.Packages.props` pins the extension at or above the compatibility floor the - fleet's `dotnet-codestyle` testing guidance defines, for two reasons rather than one. An older release - built against the Microsoft.Testing.Platform major version before the one xunit.v3 carries throws a - `TypeLoadException`, runs zero tests, and still writes a well-formed Cobertura file reporting full - coverage, leaving only the non-zero exit to say the run reported nothing. And the floor is the first - release where every test project writes into the one shared `--results-directory` the invocation names - rather than resolving that relative path per project, which is what the rename loop's glob depends on. + fleet's `dotnet-codestyle` testing guidance defines, for two reasons rather than one. First, an older + release is built against the Microsoft.Testing.Platform major version before the one xunit.v3 carries. + It throws a `TypeLoadException` and runs zero tests. It still writes a well-formed Cobertura file + reporting full coverage, so only the non-zero exit says the run reported nothing. Second, the floor is + the first release where every test project writes into the one shared `--results-directory` the + invocation names. The rename loop's glob depends on that, rather than on a path resolved per project. - **D1.3 Lint enforces the editor checks in CI.** Output: `validate-task`'s `lint` job runs CSharpier check, `dotnet format style --verify-no-changes`, `markdownlint-cli2`, `cspell` on the user-facing docs (README, HISTORY), `ruff` and `mypy` over the `RegressionTests` Python tooling, `actionlint` (which shellchecks every From 2917b1d38998b79f3600bfbbc86275fe0c034909 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Fri, 25 Sep 2026 09:23:54 -0700 Subject: [PATCH 4/5] Name Where the Coverage Floor Is Defined Answers Copilot on #998: the first mention of the dotnet-codestyle testing guidance names its path in the hub, as the fleet names a hub-local skill, so a reader can check the floor. Co-Authored-By: Claude Opus 5.5 (1M context) --- WORKFLOW.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WORKFLOW.md b/WORKFLOW.md index 87950de9..d84a6f6e 100644 --- a/WORKFLOW.md +++ b/WORKFLOW.md @@ -344,7 +344,8 @@ Each is a **MUST**, stated as input -> output plus the failure it prevents. a name `codecov-cli`'s own file finder does not match (its patterns are `*coverage*.*` and an exact `cobertura.xml`), so the step prefixes each report to `coverage-.cobertura.xml`, keeping the guid that makes it unique. `Directory.Packages.props` pins the extension at or above the compatibility floor the - fleet's `dotnet-codestyle` testing guidance defines, for two reasons rather than one. First, an older + fleet's `dotnet-codestyle` testing guidance defines (`.agents/skills/dotnet-codestyle/references/testing.md` + in the hub), for two reasons rather than one. First, an older release is built against the Microsoft.Testing.Platform major version before the one xunit.v3 carries. It throws a `TypeLoadException` and runs zero tests. It still writes a well-formed Cobertura file reporting full coverage, so only the non-zero exit says the run reported nothing. Second, the floor is From f9de5f88fc50c5f660d2cd9348e2de371f0fc712 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Fri, 25 Sep 2026 09:28:18 -0700 Subject: [PATCH 5/5] Link the In-Repo Copy of the Testing Guidance Answers Copilot on #998: this repository carries the dotnet-codestyle skill under .github/skills, so the floor's source links there. Co-Authored-By: Claude Opus 5.5 (1M context) --- WORKFLOW.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/WORKFLOW.md b/WORKFLOW.md index d84a6f6e..17e5399e 100644 --- a/WORKFLOW.md +++ b/WORKFLOW.md @@ -344,8 +344,9 @@ Each is a **MUST**, stated as input -> output plus the failure it prevents. a name `codecov-cli`'s own file finder does not match (its patterns are `*coverage*.*` and an exact `cobertura.xml`), so the step prefixes each report to `coverage-.cobertura.xml`, keeping the guid that makes it unique. `Directory.Packages.props` pins the extension at or above the compatibility floor the - fleet's `dotnet-codestyle` testing guidance defines (`.agents/skills/dotnet-codestyle/references/testing.md` - in the hub), for two reasons rather than one. First, an older + fleet's `dotnet-codestyle` testing guidance defines + ([`.github/skills/dotnet-codestyle/references/testing.md`](.github/skills/dotnet-codestyle/references/testing.md)), + for two reasons rather than one. First, an older release is built against the Microsoft.Testing.Platform major version before the one xunit.v3 carries. It throws a `TypeLoadException` and runs zero tests. It still writes a well-formed Cobertura file reporting full coverage, so only the non-zero exit says the run reported nothing. Second, the floor is