Skip to content

Migrate the Test Project to Microsoft.Testing.Platform - #95

Merged
ptr727 merged 2 commits into
developfrom
resync-mtp-hub
Aug 30, 2026
Merged

Migrate the Test Project to Microsoft.Testing.Platform#95
ptr727 merged 2 commits into
developfrom
resync-mtp-hub

Conversation

@ptr727

@ptr727ptr727 commented Aug 30, 2026

Copy link
Copy Markdown
Owner

Takes the hub's MTP-native unit-test step from ptr727/ProjectTemplate#1107, promoted in ptr727/ProjectTemplate#1111, and migrates this repo's test project onto the runner that step requires.

Why the Two Move Together

The hub's reusable validate-task.yml now runs dotnet test --coverage --coverage-output-format cobertura --results-directory ./coverage. That step is hub-hosted, so a caller cannot patch it.

This repo's test project is on xunit.v3 4.0.0, which is MTP-based, and was held on the VSTest adapter by an explicit <IsTestingPlatformApplication>false</IsTestingPlatformApplication> opt-out, because the .NET 10 SDK refuses to run an MTP project through classic dotnet test. Bumping the validator pin without migrating fails the unit-test job outright, and migrating without bumping the pin leaves the old --collect:"XPlat Code Coverage" argument pointed at a project that no longer answers it. So the pin bump and the migration are one change.

What Changed

  • global.json (new) declares the Microsoft.Testing.Platform test runner. It carries no sdk key, so it pins no SDK version, and it affects nothing but test execution: the Docker build never copies it, nbgv does not read it, and dotnet publish is unaffected.
  • PhotoCleanerTests.csproj drops the IsTestingPlatformApplication opt-out and xunit.runner.visualstudio, the VSTest adapter MTP replaces, and swaps coverlet.collector for Microsoft.Testing.Extensions.CodeCoverage, whose VSTest data collector MTP would otherwise ignore without failing.
  • Directory.Packages.props pins that extension at 18.10.0, above the 18.9.0 floor D1.6 states.
  • The four hub reusable-workflow pins move to 2.0.526 together, keeping the whole chain on one hub commit.
  • codecov.yml ignores **/obj/**, see below.
  • .gitignore covers the report shapes the new collector can write.
  • WORKFLOW.md D1.6 is re-vendored from the hub canonical at 2.0.526, and OPERATIONS.md replaces the now-inverted Dependabot runbook entry that told a future reader to set the opt-out this change removes.

The Platform Version Has No Skew

All three test-stack packages resolve to Microsoft.Testing.Platform 2.3.3, read from PhotoCleanerTests/obj/project.assets.json: xunit.v3 4.0.0, Microsoft.NET.Test.Sdk 18.9.0, and Microsoft.Testing.Extensions.CodeCoverage 18.10.0. A skew between them is the silent-green failure D1.6 documents, where the run throws TypeLoadException, executes zero tests, and still writes a well-formed Cobertura file reporting full coverage. The OPERATIONS.md runbook entry now names that class in the direction Dependabot can actually produce it, a bump upward onto a newer platform major, rather than the downward one the first draft described, which Dependabot cannot reach from a 18.10.0 pin.

The Coverage Denominator Moved, and One Part of It Is Fixed Here

The MTP extension is not a drop-in for coverlet on what it instruments.

  • The test assembly is still excluded. Coverlet's IncludeTestAssembly defaults false, and the concern was that the MTP extension's own default exclusions do not name PhotoCleanerTests.dll. Measured rather than assumed: the produced report contains zero PhotoCleanerTests and zero PhotoCleanerBenchmarks entries, so no ignore entry is owed for either.
  • Source-generator output is newly included. The report names PhotoCleaner/obj/Debug/net10.0/**/*.g.cs (the System.Text.Json, Microsoft.Gen.Logging, and RegexGenerator outputs). That is build product rather than reviewed source, and it exists in no checkout Codecov can map a path to, so codecov.yml now ignores **/obj/**.

Verification

On SDK 10.0.400, in a clean worktree:

  • dotnet test --coverage --coverage-output-format cobertura --results-directory ./coverage exits 0, running 373 tests: 368 passed, 5 skipped (the Docker-gated VerifyTaskTests cases).
  • It writes one coverage/<guid>.cobertura.xml at line-rate="0.7447", branch-rate="0.6926", 5014 of 6733 lines covered. Real data, which also rules out the zero-tests-full-coverage failure mode above.
  • dotnet build (0 warnings), dotnet csharpier check ., dotnet format style --verify-no-changes --severity=info, and dotnet husky run are clean.
  • markdownlint, cspell, and editorconfig-checker are clean. The editorconfig-checker's 24 local findings are all under obj/ and bin/, which a CI checkout does not carry.

Not in This PR

The resync also found hub drift unrelated to MTP: two GOVERNANCE.md verbatim sections trailing the canonical, a WORKFLOW.md D8.3 sentence and a Section-3 reference, the AGENTS.md intro still saying the file holds "two things" after the Fleet Bootstrap section made it three, a missing .editorconfig-checker.json exclude block, and two stale .github/skills/*/SKILL.md files. Those are a separate drift class and follow in their own PR off this one once it merges.

One item needs a human check rather than a CI run: dropping xunit.runner.visualstudio removes the VSTest adapter the C# Dev Kit Test Explorer has historically discovered through. Recent builds support MTP natively, and the CLI is unaffected either way, but the VS Code Testing panel is worth opening once before this merges.

Summary by CodeRabbit

  • Chores

    • Updated automated merge, release, validation, and build workflows.
    • Standardized test execution and code coverage collection with Microsoft Testing Platform.
    • Improved coverage exclusions, report generation, and reporting configuration.
  • Documentation

    • Updated operational guidance for coverage reports, test runners, and dependency troubleshooting.
    • Clarified coverage requirements, report handling, and continuous integration reporting behavior.

The hub's reusable validator moved its .NET unit-test step to the MTP-native
`dotnet test --coverage` form in ptr727/ProjectTemplate#1107, promoted in #1111.
This repo's test project is on xunit.v3 4.0.0, which is MTP-based, and was held
on the VSTest adapter by an explicit `IsTestingPlatformApplication` opt-out
because the .NET 10 SDK refuses to run an MTP project through classic
`dotnet test`. Taking the new validator pin without migrating would fail the
unit-test job outright, so the two move together.
- `global.json` declares the Microsoft.Testing.Platform test runner. It carries
no `sdk` key, so it pins no SDK version and affects nothing but test
execution.
- `PhotoCleanerTests.csproj` drops the `IsTestingPlatformApplication` opt-out
and `xunit.runner.visualstudio`, the VSTest adapter MTP replaces, and swaps
`coverlet.collector` for `Microsoft.Testing.Extensions.CodeCoverage`, whose
VSTest data collector MTP would otherwise ignore without failing.
- `Directory.Packages.props` pins that extension at 18.10.0, above the 18.9.0
floor `WORKFLOW.md` D1.6 states. It resolves to Microsoft.Testing.Platform
2.3.3, the same platform version `xunit.v3` 4.0.0 and `Microsoft.NET.Test.Sdk`
18.9.0 resolve to, so the three carry no skew.
- The four hub reusable-workflow pins move to 2.0.526 together, keeping the
whole chain on one hub commit.
- `codecov.yml` ignores `**/obj/**`. The MTP extension instruments the source
generators' output, which coverlet did not, and that output exists in no
checkout Codecov can map a path to.
- `.gitignore` covers the report shapes the new collector can write.
- `WORKFLOW.md` D1.6 is re-vendored from the hub canonical at 2.0.526, and
`OPERATIONS.md` drops the now-inverted Dependabot runbook entry describing the
opt-out this change removes.
Verified locally on SDK 10.0.400: `dotnet test --coverage
--coverage-output-format cobertura --results-directory ./coverage` exits 0 and
runs 373 tests (368 passed, 5 Docker-gated skips), writing one
`<guid>.cobertura.xml` at 74.5% line rate that names only `PhotoCleaner/`
sources. Build, csharpier, `dotnet format style`, `dotnet husky run`,
markdownlint, cspell, and editorconfig-checker are all clean.
CopilotAI lite review requested due to automatic review settings August 30, 2026 14:55
@coderabbitai

coderabbitaiBot commented Aug 30, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b99e71cc-9060-468e-bac2-027021392cbb

📥 Commits

Reviewing files that changed from the base of the PR and between 2816586 and f750a0b.

📒 Files selected for processing (2)
  • OPERATIONS.md
  • codecov.yml

Included review availability: Your plan provides up to 10 included reviews per hour; 2 remain after this review.


📝 Walkthrough

Walkthrough

The pull request updates reusable CI workflow revisions and migrates test coverage collection from Coverlet and VSTest integration to Microsoft Testing Platform with Cobertura reporting.

Changes

Microsoft Testing Platform coverage

Layer / File(s)Summary
Runner and coverage configuration
global.json, Directory.Packages.props, PhotoCleanerTests/PhotoCleanerTests.csproj
The repository selects Microsoft Testing Platform and replaces Coverlet and the VSTest adapter with Microsoft.Testing.Extensions.CodeCoverage.
Coverage reporting and repository rules
OPERATIONS.md, WORKFLOW.md, .gitignore, codecov.yml
Documentation and ignore rules now cover Cobertura output, normalized coverage filenames, MTP configuration, and ignored generated directories.

Reusable workflow revisions

Layer / File(s)Summary
CI reusable workflow pins
.github/workflows/merge-bot-pull-request.yml, .github/workflows/publish-release.yml, .github/workflows/test-pull-request.yml
Merge-bot, release, validation, and smoke-build jobs now reference newer pinned reusable workflows.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk:⚪ Minimal · up to f750a

The test project is migrated to Microsoft.Testing.Platform with updated coverage handling and workflow pins, and the reported validation checks pass; no actionable merge-blocking risk remains.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and concisely describes the primary change: migrating the test project to Microsoft.Testing.Platform. It is specific, relevant, and consistent with the pull request objectives.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0 files. (2 skipped: 2 unsupported.)

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch resync-mtp-hub

Comment @coderabbitai help to get the list of available commands.

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Migrate test execution and coverage to Microsoft.Testing.Platform

✨ Enhancement⚙️ Configuration changes📝 Documentation🕐 20-40 Minutes

Grey Divider

AI Description

• Migrates xUnit tests from VSTest to Microsoft.Testing.Platform.
• Aligns reusable workflows with MTP-native coverage collection.
• Documents platform-version safeguards and excludes generated coverage artifacts.
Diagram

graph TD
A["PR workflows"] -->|pin update| B["Hub validator"] -->|runs| C["dotnet test"] -->|reads| D["Global config"] -->|launches| E["xUnit tests"] -->|loads| F["MTP coverage"] -->|writes| G["Cobertura reports"] -->|uploads| H["Codecov"]
Loading
High-Level Assessment

The coordinated migration is the appropriate approach because the promoted validator and MTP project configuration are mutually dependent. Retaining the old validator would defer required compatibility work, while locally duplicating the validator would create workflow drift.

Files changed (10) +26 / -18

Enhancement (1) +2 / -7
PhotoCleanerTests.csprojRun the xUnit project directly on MTP+2/-7

Run the xUnit project directly on MTP

• Removes the VSTest opt-out, Visual Studio adapter, and coverlet collector. Adds the native Microsoft.Testing.Platform coverage extension.

PhotoCleanerTests/PhotoCleanerTests.csproj

Documentation (2) +4 / -3
OPERATIONS.mdDocument MTP coverage and dependency-skew recovery+3/-2

Document MTP coverage and dependency-skew recovery

• Updates local-versus-CI test guidance for the new coverage command. Replaces the obsolete VSTest opt-out runbook with checks for Microsoft.Testing.Platform version skew and records global runner selection.

OPERATIONS.md

WORKFLOW.mdRe-vendor the MTP coverage workflow contract+1/-1

Re-vendor the MTP coverage workflow contract

• Expands D1.6 with the MTP runner requirement, coverage package floor, multi-project output handling, and safeguards against silent zero-test coverage reports.

WORKFLOW.md

Other (7) +20 / -8
merge-bot-pull-request.ymlAdvance merge-bot workflow to hub 2.0.526+1/-1

Advance merge-bot workflow to hub 2.0.526

• Updates the reusable merge-bot task pin to the same promoted hub revision as the remaining workflow chain.

.github/workflows/merge-bot-pull-request.yml

publish-release.ymlAlign release workflow tasks with hub 2.0.526+3/-3

Align release workflow tasks with hub 2.0.526

• Moves publish planning, validation, and release building to one promoted ProjectTemplate commit. The validation task now supplies the MTP-native coverage command.

.github/workflows/publish-release.yml

test-pull-request.ymlUse MTP-capable validation and build workflows+2/-2

Use MTP-capable validation and build workflows

• Updates pull-request validation and smoke-build reusable workflow pins to hub 2.0.526.

.github/workflows/test-pull-request.yml

.gitignoreIgnore MTP coverage output formats+5/-0

Ignore MTP coverage output formats

• Adds test-results directories, Cobertura XML files, and binary coverage files produced by the new collector.

.gitignore

Directory.Packages.propsReplace VSTest coverage and adapter packages+1/-2

Replace VSTest coverage and adapter packages

• Removes central versions for coverlet.collector and xunit.runner.visualstudio. Pins Microsoft.Testing.Extensions.CodeCoverage 18.10.0 for compatible MTP-native collection.

Directory.Packages.props

codecov.ymlExclude generated obj sources from coverage+3/-0

Exclude generated obj sources from coverage

• Ignores instrumented source-generator output under obj directories because it is generated build product that Codecov cannot map to reviewed source.

codecov.yml

global.jsonSelect Microsoft.Testing.Platform repository-wide+5/-0

Select Microsoft.Testing.Platform repository-wide

• Adds runner-only global configuration for Microsoft.Testing.Platform without pinning an SDK version.

global.json

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0)📘 Rule violations (0)📎 Requirement gaps (0)

Grey Divider

Great, no issues found!

Qodo reviewed your code and found no material issues that require review

Grey Divider

Tip of the day
💡 Did you know, you can enable the Remediation agent and Qodo fixes findings in a dedicated fix PR

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Approval recommended

The migration is consistent across runner selection, package pins, docs, and workflow pins, with only minor doc-grammar nits noted.

Pull request overview

Migrates PhotoCleaner’s xUnit v3 test project to run under Microsoft.Testing.Platform (MTP) so it remains compatible with the hub-hosted reusable validator’s updated dotnet test --coverage ... invocation and continues producing uploadable Cobertura coverage for Codecov.

Changes:

  • Added a root global.json selecting the Microsoft.Testing.Platform test runner for dotnet test.
  • Updated the test project + central package pins to use Microsoft.Testing.Extensions.CodeCoverage (and removed VSTest-only adapters/collectors).
  • Updated Codecov ignore rules, gitignore coverage outputs, operational docs, and bumped hub reusable-workflow pins together.
File summaries
FileDescription
WORKFLOW.mdUpdates the CI contract (D1.6) to describe the MTP-based coverage collection flow and its version floor.
PhotoCleanerTests/PhotoCleanerTests.csprojRemoves the VSTest opt-out/adapter and switches coverage collection to the MTP extension package.
OPERATIONS.mdUpdates local/CI verification and Dependabot runbook guidance to match the MTP + new coverage behavior.
global.jsonSelects Microsoft.Testing.Platform as the repo’s dotnet test runner (no SDK pin).
Directory.Packages.propsPins Microsoft.Testing.Extensions.CodeCoverage and removes VSTest-only coverage/adapter pins.
codecov.ymlIgnores **/obj/** to exclude source-generator outputs newly instrumented by the MTP collector.
.gitignoreIgnores coverage output shapes produced by the MTP coverage extension/tooling.
.github/workflows/test-pull-request.ymlBumps hub reusable workflow pins used for PR validation/smoke build.
.github/workflows/publish-release.ymlBumps hub reusable workflow pins used for plan/validate/build-release in publishing.
.github/workflows/merge-bot-pull-request.ymlBumps the hub reusable workflow pin for merge-bot runs.
Review details
  • Files reviewed: 9/10 changed files
  • Comments generated: 2
  • Review effort level: Lite

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadWORKFLOW.md
Comment threadOPERATIONS.md Outdated
The `Lint sources job` failed on `codecov.yml:15: comment-wrap`, because the
comment added for the `**/obj/**` ignore wrapped one sentence across two lines
and the gate wants one sentence per line. Resplit so each line holds exactly
one sentence, and dropped the path-final `obj/.` the resplit had left reading
as part of the path.
Copilot raised the same wording on `WORKFLOW.md:152` and `OPERATIONS.md:20`.
`WORKFLOW.md` D1.6 is hub canonical carried verbatim, so it is answered on the
pull request rather than edited here. `OPERATIONS.md` is this repo's own prose,
so its clause now names the two patterns `codecov-cli` actually matches instead
of asserting only that the default name is unmatched.
Also split the three sentences this branch had pushed past the 25-word cap
(`OPERATIONS.md` lines 20, 47, and 101). `sentence-length` is not in the gate's
default rule set, so none of them failed CI, but the fleet style is to write new
prose under the cap and all three were prose this branch introduced.
Verified: the hub's `prose_lint.py` over the branch diff exits 0, and the
`sentence-length` check now reports nothing on any line this branch authored.
markdownlint, `dotnet build` (0 warnings), and the 373-test suite are unchanged
and clean.
CopilotAI review requested due to automatic review settings August 30, 2026 15:07

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Approval recommended

The changes consistently align the test project, coverage tooling, and hub reusable-workflow pins with the new MTP-based validator contract without leaving behind references to the prior VSTest-based setup.

Review details
  • Files reviewed: 9/10 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@ptr727
ptr727 merged commit 816aef9 into developAug 30, 2026
19 checks passed
@ptr727
ptr727 deleted the resync-mtp-hub branch August 30, 2026 15:17
ptr727 added a commit that referenced this pull request Aug 30, 2026
* Correct the MTP Dependency and Runner Claims in OPERATIONS.md
Answers three findings raised on #96, the promotion of #95.
`PhotoCleanerTests.csproj` takes `PrivateAssets="all"` on
`Microsoft.Testing.Extensions.CodeCoverage`, and deliberately not the
`IncludeAssets` list its sibling references carry. That list omits the `compile`
assets, and MTP's generated `SelfRegisteredExtensions.cs` then fails to build
with `CS0234: The type or namespace name 'CodeCoverage' does not exist`. A
comment records this, since the next reader has the same list five lines below
to copy from.
`OPERATIONS.md` had two wrong claims, both introduced by #95.
The Dependabot runbook said `Microsoft.Testing.Extensions.CodeCoverage`,
`xunit.v3`, and `Microsoft.NET.Test.Sdk` all resolve Microsoft.Testing.Platform
2.3.3. Only the first two declare it: the coverage extension directly, and
`xunit.v3` through `xunit.v3.mtp-v2`. `Microsoft.NET.Test.Sdk` 18.9.0 declares
`Microsoft.TestPlatform.TestHost` and `Microsoft.CodeCoverage`, the VSTest
stack, and no MTP dependency at all. The skew hazard is therefore between two
packages rather than three, and the paragraph now says so while keeping the
point that `nuget-deps` bumps all three together.
That paragraph also now prescribes `dotnet nuget why` rather than
`dotnet list package --include-transitive`. The flat list cannot detect this
skew: NuGet unifies the platform to one version per target framework, so it
prints a single healthy row whichever major each package was built against,
which is a false all-clear on exactly the failure being guarded.
The `global.json` entry said `dotnet test` reaches the suite "rather than the
VSTest host the .NET 10 SDK no longer runs it under". The SDK did not drop
VSTest. What needs .NET 10 is the `global.json` `test.runner` key itself, since
that is the SDK which reads it, and MTP predates the key. The entry now says
that, and names all three things a return to VSTest would take rather than only
the adapter.
Verified: `dotnet nuget why PhotoCleanerTests/PhotoCleanerTests.csproj
Microsoft.Testing.Platform` prints exactly the two roots the prose describes.
Build (0 warnings), csharpier, `dotnet format style`, `dotnet husky run`,
markdownlint, and the hub's `prose_lint.py` over the diff are clean, and the
suite runs 373 tests at an unchanged 74.5% line rate.
* Complete the List of What Puts This Repo on MTP
Qodo raised, against the previous commit, that the `global.json` entry named
three things as selecting Microsoft.Testing.Platform and omitted the coverage
package. Correct: with `Microsoft.Testing.Extensions.CodeCoverage` in place, a
project carrying only the other three would run under VSTest with no coverage
collector at all, so the list understated what the choice rests on.
The entry now names four rather than three, and no longer frames them as a
rollback recipe, since a recipe stated in a runbook rots into a wrong one. It
describes the current state instead, which carries the same information without
promising a procedure.
It also records that a move back is not this repo's alone to make. The
`dotnet test` invocation that collects coverage lives in the hub-hosted
validator, so the runner choice is only partly local.
Verified: build (0 warnings), 373 tests at an unchanged 74.5% line rate,
markdownlint clean, and the hub's `prose_lint.py` clean over the diff, with the
one remaining `sentence-length` hit on `OPERATIONS.md:47` being the pre-existing
opening sentence this branch does not touch.
ptr727 added a commit that referenced this pull request Aug 30, 2026
The doc-drift half of the hub resync against ptr727/ProjectTemplate at
2.0.526, separated from the MTP migration (#95, #97) because the two are
different drift classes. Audit run stamp 2026-08-30T20:48:19Z, hub f3b4cc9.
- `GOVERNANCE.md`, two `verbatim` sections re-vendored byte-exact. "Durable
Knowledge and Self-Improvement" had lost the bullet on when a durable rule
earns a mechanical hook, and "Repository Boundaries and Write Safety" trailed
the hub on the worktree-isolation bullet, which now names the `gh-write-guard`
hook backstop and the standalone-clone fallback's grant.
- `WORKFLOW.md`, two dropped hub clauses restored. D8.3 regains the sentence on
a tracker setting `auto-merge: false`, and D1.2 regains the parenthetical
naming both `needs:` edges on the validation job. Every repo-specific
annotation on D1.1, D1.2, D1.4, D1.5, D4.1 and the S1 to S11 rows is kept.
- `AGENTS.md`, the intro said the file holds "two things". It has held three
since the Fleet Bootstrap section was carried, so it now says so.
- `.editorconfig-checker.json`, the hub's `Exclude` block carried. This repo has
no Python tree, but `uv` creates those cache directories when running a Python
script from the hub against this checkout, so the excludes are reachable here.
- `.github/skills/repo-worktree/SKILL.md` and `resync-a-repo/SKILL.md`,
verbatim re-vendors.
Deliberately not changed. `WORKFLOW.md` Section 3 keeps its local "and the
hub's `repo-config/README.md`" pointer, which the hub does host and which
matches how `AUDIT.md` already refers to hub-hosted tooling.
Verified: every repo-specific block in the three mixed-fidelity files survives
the re-vendor, checked by full-file diff against both the hub and the pre-change
copy. All 18 verbatim `GOVERNANCE.md` sections and all 3 `AGENTS.md` sections
now byte-match hub f3b4cc9, and `diff -rq` over `.github/skills/` is empty.
markdownlint and the hub's `prose_lint.py` over the diff are clean.
ptr727 added a commit that referenced this pull request Aug 30, 2026
* Re-Vendor Drifted Governance Sections and Skill Files from the Hub
The doc-drift half of the hub resync against ptr727/ProjectTemplate at
2.0.526, separated from the MTP migration (#95, #97) because the two are
different drift classes. Audit run stamp 2026-08-30T20:48:19Z, hub f3b4cc9.
- `GOVERNANCE.md`, two `verbatim` sections re-vendored byte-exact. "Durable
Knowledge and Self-Improvement" had lost the bullet on when a durable rule
earns a mechanical hook, and "Repository Boundaries and Write Safety" trailed
the hub on the worktree-isolation bullet, which now names the `gh-write-guard`
hook backstop and the standalone-clone fallback's grant.
- `WORKFLOW.md`, two dropped hub clauses restored. D8.3 regains the sentence on
a tracker setting `auto-merge: false`, and D1.2 regains the parenthetical
naming both `needs:` edges on the validation job. Every repo-specific
annotation on D1.1, D1.2, D1.4, D1.5, D4.1 and the S1 to S11 rows is kept.
- `AGENTS.md`, the intro said the file holds "two things". It has held three
since the Fleet Bootstrap section was carried, so it now says so.
- `.editorconfig-checker.json`, the hub's `Exclude` block carried. This repo has
no Python tree, but `uv` creates those cache directories when running a Python
script from the hub against this checkout, so the excludes are reachable here.
- `.github/skills/repo-worktree/SKILL.md` and `resync-a-repo/SKILL.md`,
verbatim re-vendors.
Deliberately not changed. `WORKFLOW.md` Section 3 keeps its local "and the
hub's `repo-config/README.md`" pointer, which the hub does host and which
matches how `AUDIT.md` already refers to hub-hosted tooling.
Verified: every repo-specific block in the three mixed-fidelity files survives
the re-vendor, checked by full-file diff against both the hub and the pre-change
copy. All 18 verbatim `GOVERNANCE.md` sections and all 3 `AGENTS.md` sections
now byte-match hub f3b4cc9, and `diff -rq` over `.github/skills/` is empty.
markdownlint and the hub's `prose_lint.py` over the diff are clean.
* Drop the D1.2 Parenthetical Again, Which Is False for This Repo
Both reviewers independently flagged the D1.2 clause restored in the previous
commit. They are right, and the restore was a mistake.
The hub's parenthetical reads "(both the aggregator and `smoke-build`, which
`needs:` the validation job by name)". In this repo `smoke-build` declares
`needs: [changes]` and nothing else, per
`.github/workflows/test-pull-request.yml`, so the clause asserts an edge that
does not exist here. The bullet's own repo-specific annotation two sentences
later already says as much: the aggregator `needs:` validate directly,
independent of `changes`/`smoke-build`.
So its absence from this copy was a deliberate local adaptation rather than
drift from the hub, and re-vendoring it put a false claim about this repo's own
workflow into this repo's own contract doc. D1.2 goes back to the form it had
on develop.
This does not generalize to the D8.3 clause in the same commit, which stays.
That one describes a tracker this repo does not have, rather than contradicting
a workflow it does have, and `WORKFLOW.md` carries the whole D8 section as
inapplicable-but-present already.
Verified against the workflow rather than the doc: `grep` for the `needs:` lines
in `test-pull-request.yml` gives `smoke-build` -> `[changes]` and
`check-workflow-status` -> `[changes, validate, smoke-build]`. markdownlint and
the hub's `prose_lint.py` over the diff stay clean.
Sign up for freeto 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

@ptr727