Skip to content

[fix] Fix CopyTraceDataCollectorArtifacts overwriting newer MTP CodeCoverage DLLs - #15794

Open
Jakub Jareš (nohwnd) wants to merge 8 commits into
mainfrom
fix/issue-15387-345ac389b57ce7df
Open

[fix] Fix CopyTraceDataCollectorArtifacts overwriting newer MTP CodeCoverage DLLs#15794
Jakub Jareš (nohwnd) wants to merge 8 commits into
mainfrom
fix/issue-15387-345ac389b57ce7df

Conversation

@nohwnd

@nohwnd Jakub Jareš (nohwnd) commented May 17, 2026

Copy link
Copy Markdown
Member

Fixes microsoft/vstest#15387

CopyTraceDataCollectorArtifacts copied the package payload directly after publish item computation, which let an older Microsoft.CodeCoverage.Core.dll replace the newer assembly supplied by Microsoft.Testing.Extensions.CodeCoverage. The attempted Overwrite="false" fix was invalid because MSBuild's Copy task has no such parameter.

The target now registers its artifacts with ResolvedFileToPublish and first removes the ones whose RelativePath the project publish already supplies, so the SDK does the copying and the project's own files stay authoritative. It does not look at PackageReference at all, so a direct and a transitive Microsoft.Testing.Extensions.CodeCoverage behave the same. Files that only this package carries, such as CodeCoverage\CodeCoverage.exe, are still published, which is what makes /collect:"Code Coverage" work with dotnet vstest on a machine without the NuGet cache.

Verified with two publish reproductions against the package layout, each run against the target before and after the change. With a newer Microsoft.CodeCoverage.Core.dll already in ResolvedFileToPublish, the published file comes from the package before the change and from the project after it. With no competing asset, the published file set is identical before and after, and CodeCoverage\CodeCoverage.exe is published in every case.

🤖

…e DLLs

When Microsoft.Testing.Extensions.CodeCoverage is referenced alongside
Microsoft.NET.Test.Sdk, the CopyTraceDataCollectorArtifacts target
blindly copies older Microsoft.CodeCoverage artifacts into the publish
directory, overwriting the newer DLLs from the MTP package. This causes
a FileNotFoundException at runtime because the newer version is expected
but the older one is present.

Fix: Skip the blind copy when Microsoft.Testing.Extensions.CodeCoverage
is directly referenced, as that package already provides the correct
version of all its artifacts.

Fixes #15387

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI lite review requested due to automatic review settings May 17, 2026 01:29

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.

Pull request overview

This PR updates the Microsoft.CodeCoverage.targets packaging logic to avoid overwriting newer code coverage binaries during dotnet publish when newer coverage tooling is present, addressing the publish-time assembly version conflict described in #15387.

Changes:

  • Adds MSBuild logic to detect Microsoft.Testing.Extensions.CodeCoverage and conditionally skip CopyTraceDataCollectorArtifacts.
  • Updates the target’s inline documentation to explain why the copy is skipped in that scenario.

Comment thread src/package/Microsoft.CodeCoverage/Microsoft.CodeCoverage.targets Outdated
Comment thread src/package/Microsoft.CodeCoverage/Microsoft.CodeCoverage.targets Outdated

@nohwnd Jakub Jareš (nohwnd) left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

🧠 Expert Review — PR #15794

Activated dimensions (via src/package/ routing): Dependency & Package Integrity, Build Script & Infrastructure Hygiene, Cross-TFM & Framework Resolution


Critical: Detection logic may miss transitive references

The core fix uses @(PackageReference) to detect whether Microsoft.Testing.Extensions.CodeCoverage is referenced. This only catches direct references in the project file. However, the PR's own motivation describes the scenario where the package arrives transitively via MSTest.Sdk 4.0.2 — which would not be visible in @(PackageReference).

In that scenario, _MtpCodeCoverageRef will be empty, the condition evaluates to ''== '' (true = copy proceeds), and the newer DLLs are still overwritten. The fix would have no effect for the described root cause.

See the inline comment for a concrete suggestion using $(Pkgmicrosoft_Testing_Extensions_CodeCoverage) which NuGet sets for all resolved packages including transitive ones.


Other dimensions: No issues found

  • Build Script & Infrastructure Hygiene: MSBuild syntax is valid; target ordering (AfterTargets="ComputeFilesToPublish") is appropriate.
  • Cross-TFM: .targets file is TFM-agnostic; no concerns.
  • Description alignment: The PR title and description accurately describe the intent. The description is well-written and matches the diff.

🧠 Reviewed by Expert Code Reviewer

🧠 Reviewed by Expert Code Reviewer 🧠

Comment thread src/package/Microsoft.CodeCoverage/Microsoft.CodeCoverage.targets Outdated
@nohwnd

This comment has been minimized.

… reference

Use $(Pkgmicrosoft_Testing_Extensions_CodeCoverage) in addition to
@(PackageReference) to detect when Microsoft.Testing.Extensions.CodeCoverage
is present transitively (e.g. via MSTest.Sdk). NuGet sets the Pkg* property
for all resolved packages, including transitive ones.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@nohwnd

Copy link
Copy Markdown
Member Author

Commit pushed: f0d0102

🔧 Iterated by PR Iteration Agent 🔧

Comment thread src/package/Microsoft.CodeCoverage/Microsoft.CodeCoverage.targets Outdated
Comment thread src/package/Microsoft.CodeCoverage/Microsoft.CodeCoverage.targets Outdated
@nohwnd

Copy link
Copy Markdown
Member Author

needs more careful analysis.

@nohwnd

This comment has been minimized.

…f MTP detection

Replace the Microsoft.Testing.Extensions.CodeCoverage detection logic with
Overwrite="false" on the Copy task. This is simpler and more robust:

- Files already placed by MTP CodeCoverage (which runs before this target)
  are not overwritten with older versions from this package.
- All TraceDataCollector-specific files are still copied for users without MTP.
- No package detection logic needed (avoids Pkgxxx reliability concerns).

The previous detection-based approach also had a gap: it skipped copying *all*
files, including TraceDataCollector-specific ones that MTP doesn't provide,
which could silently break /collect:"Code Coverage" for MSTest.Sdk users.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@nohwnd

Copy link
Copy Markdown
Member Author

Commit pushed: c264ce4

🔧 Iterated by PR Iteration Agent 🔧

Copilot AI review requested due to automatic review settings May 29, 2026 15:52
@nohwnd

This comment has been minimized.

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.

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated 1 comment.

Comment thread src/package/Microsoft.CodeCoverage/Microsoft.CodeCoverage.targets Outdated

@nohwnd Jakub Jareš (nohwnd) left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

🧠 Expert Review — PR #15794

The Overwrite="false" approach is a clean, robust fix. It works regardless of MSBuild target execution order between this package and Microsoft.Testing.Extensions.CodeCoverage (as long as MTP uses the default Overwrite=true), so the fix is more reliable than the previous PackageReference-detection approach.

No blocking issues found. One inline note on the code comment's accuracy and a minor observation about incremental publish behavior.


🧠 Reviewed by Expert Code Reviewer 🧠

🧠 Reviewed by Expert Code Reviewer 🧠

Comment thread src/package/Microsoft.CodeCoverage/Microsoft.CodeCoverage.targets Outdated
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@nohwnd

Copy link
Copy Markdown
Member Author

Commit pushed: 64869a6

🔧 Iterated by PR Iteration Agent 🔧

Jakub Jareš (nohwnd) and others added 2 commits August 17, 2026 11:25
Register legacy artifacts with ResolvedFileToPublish and exclude paths already supplied by the project publish.

🤖

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 17, 2026 09:42

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 wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

@github-actions github-actions Bot 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.

🧠 Expert Review — PR #15794

Activated dimensions (via src/package/ + eng/ routing): Dependency & Package Integrity, Build Script & Infrastructure Hygiene, Cross-TFM & Framework Resolution, Source Build & Cross-Platform Compliance


Core fix — Microsoft.CodeCoverage.targets

The ResolvedFileToPublish-based deduplication is a correct and robust approach. Replacing the filesystem-level Copy with MSBuild item-level exclusion ensures:

  • The exclusion operates before any files are written, eliminating the race between AfterTargets="ComputeFilesToPublish" targets.
  • MatchOnMetadataOptions="PathLike" correctly handles slash-direction differences (forward vs back) between the legacy package's RelativePath and the paths set by MTP, making the comparison cross-platform safe.
  • Using _TraceDataCollectorArtifacts (underscore prefix) avoids polluting the consumer's item namespace.

No issues found with the core fix.


[Description] — Minor inaccuracy

The PR description states: "The attempted Overwrite="false" fix was invalid because MSBuild's Copy task has no such parameter."

This is not correct — MSBuild's Copy task does have an [Overwrite parameter]((learn.microsoft.com/redacted) The reason the Overwrite="false" approach was abandoned (based on what the previous review flagged) was that the copy ordering between the legacy package and MTP was not guaranteed in the full dotnet publish pipeline. The description's stated rationale is misleading; the change is still the right direction, but the explanation should be corrected.


[Build Script & Infrastructure Hygiene] — Missing final newline

eng/AfterSolutionBuild.targets is missing the final newline (file ends with </Project> and no trailing \n). The file previously had one; it was dropped by the last edit. This is a minor SA1518/editorconfig hygiene issue.


Other dimensions: No issues found

  • Cross-TFM: No TFM-specific behavior in the changed targets.
  • Source Build & Cross-Platform Compliance: The DotNetBuild skip gate added to _VerifyNuGetPackages is correct — source-built assemblies ship different assembly versions and the binding-redirect check would false-positive.
  • eng/PublishForPackaging.targets: Design is sound. See inline comment about one inaccurate anti-recursion explanation (documentation only; actual behavior is correct).

🧠 Reviewed by Expert Code Reviewer 🧠

🧠 Reviewed by Expert Code Reviewer 🧠

Comment thread eng/PublishForPackaging.targets
@nohwnd
Jakub Jareš (nohwnd) marked this pull request as ready for review August 17, 2026 10:27
…ed files

Explain why the target still exists, that the exclusion is keyed on
RelativePath against ResolvedFileToPublish, and that it never inspects
PackageReference, so a direct or transitive Microsoft.Testing.Extensions.CodeCoverage
is handled the same way.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 17, 2026 19:39

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 wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

@github-actions github-actions Bot 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.

🧠 Expert Review — PR #15794

Activated dimensions (via src/package/ routing): Dependency & Package Integrity, Build Script & Infrastructure Hygiene, Cross-TFM & Framework Resolution


Core fix — CopyTraceDataCollectorArtifacts

The ResolvedFileToPublish-based deduplication is correct. Replacing the direct Copy task with item-level exclusion ensures the project's own files (from Microsoft.Testing.Extensions.CodeCoverage) take precedence, regardless of whether that package arrives directly or transitively. MatchOnMetadataOptions="PathLike" correctly normalises slash direction for cross-platform correctness. The underscore-prefixed _TraceDataCollectorArtifacts item name avoids polluting the consumer's item namespace. No issues with the core fix.


Rebase required — MsCoverageReferencedPathMaps is behind main

The PR branch diverged from main before two changes were made to MsCoverageReferencedPathMaps:

  1. and '$(DesignTimeBuild)' != 'true' in the target condition — prevents the target from running on every IDE design-time build, avoiding unnecessary ResolveProjectReferences calls and IDE slowdowns.
  2. BuildInParallel="true" on the <MSBuild> task — enables parallel resolution for multi-project solutions.

Both are present in main; neither is in this branch's head. A squash-merge would drop them. See the inline comment for the exact location.

This PR needs a rebase onto current main before merging, so the only change in the resulting merge is the intended CopyTraceDataCollectorArtifacts fix.


Description alignment

The PR description is accurate for the CopyTraceDataCollectorArtifacts change. No issues.


🧠 Reviewed by Expert Code Reviewer 🧠

🧠 Reviewed by Expert Code Reviewer 🧠

Comments that could not be inline-anchored

src/package/Microsoft.CodeCoverage/Microsoft.CodeCoverage.targets:51

[Build Script & Infrastructure Hygiene] Two features from main are absent from this target in the PR head

Current main has two additions to MsCoverageReferencedPathMaps that are not in this branch:

  1. and &#39;$(DesignTimeBuild)&#39; != &#39;true&#39; in the target condition — without this, the target runs on every IDE design-time build (IntelliSense, background analysis), which calls ResolveProjectReferences unnecessarily and can degrade IDE responsiveness.

  2. BuildInParallel=&quot;true&quot;

The pull request was diffing from a merge base of 2026-05-17, so the Files tab listed 654 files instead of the one file this change touches. Merging current main in moves the merge base forward so the diff is reviewable.
Copilot AI review requested due to automatic review settings August 20, 2026 08:39
@nohwnd

Copy link
Copy Markdown
Member Author

Merged current main in, which brings in the two MsCoverageReferencedPathMaps changes that were missing here: and '$(DesignTimeBuild)' != 'true' on the target condition, and BuildInParallel="true" on the <MSBuild> task. Both are in the head now, and the target matches main exactly, git diff main...HEAD does not touch it.

The merge also fixed the Files tab. It was diffing from a merge base of 17 May and listing 654 files, now it shows the one file this change touches, 18 insertions and 5 deletions.

I rechecked the publish behaviour after the merge, with two reproductions against the package layout, each run against the target before and after the change. With a newer Microsoft.CodeCoverage.Core.dll already in ResolvedFileToPublish, the published file comes from the package before the change and from the project after it. With no competing asset the published file set is identical before and after, and CodeCoverage\CodeCoverage.exe is published in all four runs.

🤖

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.

Pull request overview

Copilot reviewed 1 out of 1 changed files in this pull request and generated no new comments.

@github-actions github-actions Bot 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.

🧠 Expert Review — PR #15794

Follow-up review (current head: 72078b98)

The previous REQUEST_CHANGES concern — that MsCoverageReferencedPathMaps was missing and '$(DesignTimeBuild)' != 'true' and BuildInParallel="true" from main — is fully resolved. Both are present in the current head and match main exactly.

The only remaining diff is the intended CopyTraceDataCollectorArtifacts fix, which was already reviewed and approved in prior rounds. The fix is correct:

  • _TraceDataCollectorArtifacts (underscore-prefixed) avoids polluting the consumer's item namespace.
  • The RelativePath metadata computation and MatchOnMetadataOptions="PathLike" correctly handle slash-direction differences on Windows vs. Linux.
  • Removing from _TraceDataCollectorArtifacts before including in ResolvedFileToPublish ensures the project's own files (from Microsoft.Testing.Extensions.CodeCoverage) stay authoritative, whether that package is direct or transitive.

No blocking issues. This PR is ready for maintainer approval.


🧠 Reviewed by Expert Code Reviewer 🧠

🧠 Reviewed by Expert Code Reviewer 🧠

@nohwnd

Copy link
Copy Markdown
Member Author

Worth recording how this actually shows up, because it depends on file timestamps and does not always reproduce.

On main the target copies the package payload into the publish folder, and _CopyResolvedFilesToPublishPreserveNewest then copies the project's own files over it, but only when the source is newer than the file already sitting there. So the write times in the NuGet cache decide the winner. When Microsoft.CodeCoverage was extracted after Microsoft.Testing.Extensions.CodeCoverage, the old Microsoft.CodeCoverage.Core.dll stays and the newer one is never copied, which is microsoft/vstest#15387. When the times fall the other way main publishes the project's file by chance, so a quick repro on main can look fine.

Checked against the package layout on SDK 10.0.302. With the package file given the later write time, main publishes the old file and this branch publishes the project's one. With no competing asset both publish the same 8 files, and CodeCoverage\CodeCoverage.exe is present in every run.

The change removes the timestamp dependency, the package file is dropped from the item list when the project already supplies that relative path, so neither target order nor mtime decides it any more.

🤖

@nohwnd

Copy link
Copy Markdown
Member Author

State of this PR, checked against head 72078b98.

The CHANGES_REQUESTED verdict is stale and needs dismissing by hand. It asked for MsCoverageReferencedPathMaps to be brought up to main: '$(DesignTimeBuild)' != 'true' in the target condition and BuildInParallel="true" on the MSBuild task. Both are in the head now, lines 50 and 54, and neither appears in git diff main...HEAD, so they match main exactly. The same workflow confirmed this on 20 August, but it posted COMMENTED, and a COMMENTED review does not clear a standing CHANGES_REQUESTED. Only a dismissal or an APPROVED from that reviewer will.

The stale merge base is gone. git diff main...HEAD --stat and the compare API both report one file, src/package/Microsoft.CodeCoverage/Microsoft.CodeCoverage.targets, +18/-5. The 654-file diff from August is no longer there, so the Files tab is now the real change.

One correction to the record. The 17 August review said the description was wrong to claim Copy has no Overwrite parameter. The description is right:

error MSB4064: The "Overwrite" parameter is not supported by the "Copy" task loaded from
assembly: Microsoft.Build.Tasks.Core, Version=15.1.0.0 ...

Youssef Fahmy (@Youssef1313) was correct in the earlier thread. Nothing in the description needs changing.

The item logic does what it claims. I reproduced the target in a standalone project against a ResolvedFileToPublish that already carries lib/Microsoft.CodeCoverage.Core.dll with forward slashes, while the package layout supplies lib\... with backslashes:

  • lib/Microsoft.CodeCoverage.Core.dll resolves to the project's file, not the package's
  • CodeCoverage\CodeCoverage.exe is still published
  • a package-only assembly is still published

So MatchOnMetadataOptions="PathLike" does bridge the slash difference, and the files only this package carries still reach the publish folder.

All checks pass on this head. main has not touched this file since the merge base and merging main in is clean, so there is nothing to rebase.

🤖

@nohwnd
Jakub Jareš (nohwnd) dismissed github-actions[bot]’s stale review September 7, 2026 05:50

Dismissing: the concern in this review is resolved and its author has since retracted it.

The review asked for a rebase because MsCoverageReferencedPathMaps was missing '$(DesignTimeBuild)' != 'true' and BuildInParallel="true" from main. Both are present at the current head. git show origin/main:src/package/Microsoft.CodeCoverage/Microsoft.CodeCoverage.targets and git show 72078b98:<same path> are identical in that target, and the three-dot compare against main is one file, +18/-5, touching only CopyTraceDataCollectorArtifacts.

The same reviewer confirmed this on 2026-08-20, but as a comment, which does not clear a changes-requested state.

🤖

@nohwnd

Copy link
Copy Markdown
Member Author

I verified this against the actual failure in #15387 rather than by reading the diff.

I published a project twice against the package layout, once with main's target and once with this branch's, with a competing newer Microsoft.CodeCoverage.Core.dll already in ResolvedFileToPublish carrying a NuGet-cache-like timestamp:

target published Microsoft.CodeCoverage.Core.dll CodeCoverage\CodeCoverage.exe
main old package copy (18.0.6) published
this branch project copy (18.1.0) published

So main reproduces the reported Could not load file or assembly 'Microsoft.CodeCoverage.Core, Version=18.1.0.0', and this branch does not.

The mechanism is the incremental check on _CopyResolvedFilesToPublishPreserveNewest. The old target's Copy writes into the publish folder before the SDK copies, so the SDK then sees its output as newer than its input, treats it as up to date, and skips the newer assembly. That is why the report says it only happens on publish and not on build.

With no competing asset the published file set is identical between the two targets, six files either way, CodeCoverage\CodeCoverage.exe included. So the target keeps doing what it was added for.

One correction to an earlier automated review on this thread, since it is still in the history: it said the description is wrong to claim Copy has no Overwrite parameter. The description is right. Reflecting over Microsoft.Build.Tasks.Copy in SDK 9.0.317 gives CopiedFiles, DestinationFiles, DestinationFolder, ErrorIfLinkFails, FailIfNotIncremental, OverwriteReadOnlyFiles, Retries, RetryDelayMilliseconds, SkipUnchangedFiles, SourceFiles, SourceFolders, UseHardlinksIfPossible, UseSymboliclinksIfPossible, WroteAtLeastOneFile. There is no Overwrite, which is what Youssef Fahmy (@Youssef1313) said.

I also dismissed the stale changes-requested review: it asked for a rebase because MsCoverageReferencedPathMaps lagged main, and that target is now byte-identical to main. The compare against main is one file, +18/-5, touching only CopyTraceDataCollectorArtifacts.

🤖

@nohwnd

Jakub Jareš (nohwnd) commented Sep 7, 2026

Copy link
Copy Markdown
Member Author

Reproduced #15387 against the real packages and checked the published assembly version before and after this change.

A net10.0 project referencing Microsoft.NET.Test.Sdk 18.0.1 (which brings Microsoft.CodeCoverage 18.0.1) together with Microsoft.Testing.Extensions.CodeCoverage 18.1.0, published with dotnet publish -c Release:

before (targets as shipped today)  published Microsoft.CodeCoverage.Core.dll = 18.0.6.0
after  (this PR)                   published Microsoft.CodeCoverage.Core.dll = 18.1.0.0

18.0.6.0 is the copy from microsoft.codecoverage/18.0.1/build/netstandard2.0/, and it is the file that produces the Could not load file or assembly 'Microsoft.CodeCoverage.Core, Version=18.1.0.0' in the issue. CodeCoverage\CodeCoverage.exe, which only this package carries, is published either way, so what the target was added for still works.

On the mechanism, with the numbers from that run. ResolvedFileToPublish does carry the right file, RelativePath=Microsoft.CodeCoverage.Core.dll pointing at the 18.1.0 package, so the SDK knows which one it wants, it just never copies it:

legacy pkg (18.0.6)  size=515128  lastWrite=2025-10-23T14:07:14Z
MTP pkg    (18.1.0)  size=518680  lastWrite=2025-10-03T14:54:44Z

_CopyResolvedFilesToPublishPreserveNewest is incremental on Inputs/Outputs, and its comment in the SDK says it avoids SkipUnchangedFiles on purpose so that a size difference alone does not cause a copy. The old target's Copy writes the legacy file into the publish folder first and keeps its source timestamp, so by the time the SDK target runs its output is dated 23 October against an input dated 3 October, it counts as up to date, it is skipped, and the older assembly stays. The publish log shows exactly that, CopyTraceDataCollectorArtifacts copies the file and _CopyResolvedFilesToPublishPreserveNewest never mentions it.

The assembly versions and the file timestamps disagree here, so the raw copy has to go rather than be reordered. It is also why build is fine and only publish breaks, the build output copy does not go through this path.

🤖

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Thanks for the detailed reproduction — this confirms the _CopyResolvedFilesToPublishPreserveNewest incremental-timestamp theory and validates the current ResolvedFileToPublish-based fix (18.0.6.0 → 18.1.0.0, with CodeCoverage.exe still published either way). No code changes needed here.

Current status: PR is fully green (all 21 checks passing on the latest commit 72078b98) and the last Expert Review round found no blocking issues, calling it "ready for maintainer approval." No action required from the iteration agent at this time.

🔧 Iterated by PR Iteration Agent 🔧

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

MSTest.Sdk 4.0.2 has conflicting transitive dependencies of Microsoft.CodeCoverage.Core

3 participants