You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Impact: When $(TestingExtensionsProfile) is empty MSBuild evaluates == '' without a left-hand token, which happens to work today but is fragile. Per Rule B-2, both sides of == / != must be single-quoted to be safe against property values that contain spaces or special characters. Every other condition guard in this file and across this codebase correctly follows the '$(Prop)' == '' form; this one is the outlier. This file ships inside the MSTest.Sdk NuGet package and is evaluated for every consumer project.
π‘ Warnings
src/Package/MSTest.Sdk/Sdk/Sdk.targets
Rule B-2 β MSBuild function-call result not single-quoted on the left side of ==
Lines: 6
Current:
<IsTestApplicationCondition=" '$(IsTestApplication)' == '' AND $([MSBuild]::GetTargetFrameworkIdentifier('$(TargetFramework)')) == '.NETStandard' ">false</IsTestApplication>
Suggested:
<IsTestApplicationCondition=" '$(IsTestApplication)' == '' AND '$([MSBuild]::GetTargetFrameworkIdentifier('$(TargetFramework)'))' == '.NETStandard' ">false</IsTestApplication>
Impact: The first half of the compound condition is correctly quoted; the second half is not. MSBuild property-function calls return deterministic framework-identifier strings (.NETStandard, .NETCoreApp, etc.) so this is unlikely to cause a runtime failure today, but the inconsistency within the same Condition="" attribute is a maintenance hazard and diverges from MSBuild best-practice. This file ships in the MSTest.Sdk NuGet package and is the outermost .targets evaluated for every SDK-style consumer.
test/Directory.Build.targets
Rule B-2 β MSBuild function-call result not single-quoted on the left side of ==
Impact: Same class of defect as the Sdk.targets finding above, but in test-only infrastructure so the blast radius is limited to this repo's own test runs. Lower priority than the SDK findings; flagged for consistency.
Generated by the MSBuild Quality Review scheduled workflow.
π€ Automated content by GitHub Copilot. Posted via a maintainer's GitHub token, so it appears under their account β the account owner did not write or approve this content personally. Generated by the MSBuild Quality Review workflow.{ai_credits_suffix} Β· [β·]( Β· β·)
π§ MSBuild File Quality Report β 2026-06-11
Files reviewed: 100
Findings: π΄ 1 error Β· π‘ 2 warnings Β· π΅ 0 suggestions
π΄ Errors
src/Package/MSTest.Sdk/Sdk/Runner/Common.targets==in a condition$(TestingExtensionsProfile)is empty MSBuild evaluates== ''without a left-hand token, which happens to work today but is fragile. Per Rule B-2, both sides of==/!=must be single-quoted to be safe against property values that contain spaces or special characters. Every other condition guard in this file and across this codebase correctly follows the'$(Prop)' == ''form; this one is the outlier. This file ships inside the MSTest.Sdk NuGet package and is evaluated for every consumer project.π‘ Warnings
src/Package/MSTest.Sdk/Sdk/Sdk.targets==.NETStandard,.NETCoreApp, etc.) so this is unlikely to cause a runtime failure today, but the inconsistency within the sameCondition=""attribute is a maintenance hazard and diverges from MSBuild best-practice. This file ships in the MSTest.Sdk NuGet package and is the outermost.targetsevaluated for every SDK-style consumer.test/Directory.Build.targets==Sdk.targetsfinding above, but in test-only infrastructure so the blast radius is limited to this repo's own test runs. Lower priority than the SDK findings; flagged for consistency.Files reviewed without findings (97)
src/Adapter/MSTest.TestAdapter/build/net462/MSTest.TestAdapter.propssrc/Adapter/MSTest.TestAdapter/build/net462/MSTest.TestAdapter.targetssrc/Adapter/MSTest.TestAdapter/build/net8.0/MSTest.TestAdapter.propssrc/Adapter/MSTest.TestAdapter/build/net8.0/MSTest.TestAdapter.targetssrc/Adapter/MSTest.TestAdapter/build/net9.0/MSTest.TestAdapter.propssrc/Adapter/MSTest.TestAdapter/build/net9.0/MSTest.TestAdapter.targetssrc/Adapter/MSTest.TestAdapter/build/uap10.0/MSTest.TestAdapter.propssrc/Adapter/MSTest.TestAdapter/build/uap10.0/MSTest.TestAdapter.targetssrc/Adapter/MSTest.TestAdapter/buildTransitive/Parallelize.targetssrc/Adapter/MSTest.TestAdapter/buildTransitive/common/MSTest.TestAdapter.propssrc/Adapter/MSTest.TestAdapter/buildTransitive/common/MSTest.TestAdapter.targetssrc/Adapter/MSTest.TestAdapter/buildTransitive/uwp/MSTest.TestAdapter.propssrc/Adapter/MSTest.TestAdapter/buildTransitive/uwp/MSTest.TestAdapter.targetssrc/Analyzers/MSTest.Analyzers.Package/buildTransitive/MSTest.Analyzers.propssrc/Analyzers/MSTest.Analyzers.Package/buildTransitive/MSTest.Analyzers.targetssrc/Platform/Microsoft.Testing.Extensions.AzureDevOpsReport/build/Microsoft.Testing.Extensions.AzureDevOpsReport.propssrc/Platform/Microsoft.Testing.Extensions.AzureDevOpsReport/buildMultiTargeting/Microsoft.Testing.Extensions.AzureDevOpsReport.propssrc/Platform/Microsoft.Testing.Extensions.AzureDevOpsReport/buildTransitive/Microsoft.Testing.Extensions.AzureDevOpsReport.propssrc/Platform/Microsoft.Testing.Extensions.AzureFoundry/build/Microsoft.Testing.Extensions.AzureFoundry.propssrc/Platform/Microsoft.Testing.Extensions.AzureFoundry/buildMultiTargeting/Microsoft.Testing.Extensions.AzureFoundry.propssrc/Platform/Microsoft.Testing.Extensions.AzureFoundry/buildTransitive/Microsoft.Testing.Extensions.AzureFoundry.propssrc/Platform/Microsoft.Testing.Extensions.CrashDump/build/Microsoft.Testing.Extensions.CrashDump.propssrc/Platform/Microsoft.Testing.Extensions.CrashDump/buildMultiTargeting/Microsoft.Testing.Extensions.CrashDump.propssrc/Platform/Microsoft.Testing.Extensions.CrashDump/buildTransitive/Microsoft.Testing.Extensions.CrashDump.propssrc/Platform/Microsoft.Testing.Extensions.HangDump/build/Microsoft.Testing.Extensions.HangDump.propssrc/Platform/Microsoft.Testing.Extensions.HangDump/buildMultiTargeting/Microsoft.Testing.Extensions.HangDump.propssrc/Platform/Microsoft.Testing.Extensions.HangDump/buildTransitive/Microsoft.Testing.Extensions.HangDump.propssrc/Platform/Microsoft.Testing.Extensions.HotReload/build/Microsoft.Testing.Extensions.HotReload.propssrc/Platform/Microsoft.Testing.Extensions.HotReload/buildMultiTargeting/Microsoft.Testing.Extensions.HotReload.propssrc/Platform/Microsoft.Testing.Extensions.HotReload/buildTransitive/Microsoft.Testing.Extensions.HotReload.propssrc/Platform/Microsoft.Testing.Extensions.HtmlReport/build/Microsoft.Testing.Extensions.HtmlReport.propssrc/Platform/Microsoft.Testing.Extensions.HtmlReport/buildMultiTargeting/Microsoft.Testing.Extensions.HtmlReport.propssrc/Platform/Microsoft.Testing.Extensions.HtmlReport/buildTransitive/Microsoft.Testing.Extensions.HtmlReport.propssrc/Platform/Microsoft.Testing.Extensions.JUnitReport/build/Microsoft.Testing.Extensions.JUnitReport.propssrc/Platform/Microsoft.Testing.Extensions.JUnitReport/buildMultiTargeting/Microsoft.Testing.Extensions.JUnitReport.propssrc/Platform/Microsoft.Testing.Extensions.JUnitReport/buildTransitive/Microsoft.Testing.Extensions.JUnitReport.propssrc/Platform/Microsoft.Testing.Extensions.Retry/build/Microsoft.Testing.Extensions.Retry.propssrc/Platform/Microsoft.Testing.Extensions.Retry/buildMultiTargeting/Microsoft.Testing.Extensions.Retry.propssrc/Platform/Microsoft.Testing.Extensions.Retry/buildTransitive/Microsoft.Testing.Extensions.Retry.propssrc/Platform/Microsoft.Testing.Extensions.Telemetry/build/Microsoft.Testing.Extensions.Telemetry.propssrc/Platform/Microsoft.Testing.Extensions.Telemetry/buildMultiTargeting/Microsoft.Testing.Extensions.Telemetry.propssrc/Platform/Microsoft.Testing.Extensions.Telemetry/buildTransitive/Microsoft.Testing.Extensions.Telemetry.propssrc/Platform/Microsoft.Testing.Extensions.TrxReport/build/Microsoft.Testing.Extensions.TrxReport.propssrc/Platform/Microsoft.Testing.Extensions.TrxReport/buildMultiTargeting/Microsoft.Testing.Extensions.TrxReport.propssrc/Platform/Microsoft.Testing.Extensions.TrxReport/buildTransitive/Microsoft.Testing.Extensions.TrxReport.propssrc/Platform/Microsoft.Testing.Platform.MSBuild/build/Microsoft.Testing.Platform.MSBuild.propssrc/Platform/Microsoft.Testing.Platform.MSBuild/build/Microsoft.Testing.Platform.MSBuild.targetssrc/Platform/Microsoft.Testing.Platform.MSBuild/buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.CustomTestTarget.targetssrc/Platform/Microsoft.Testing.Platform.MSBuild/buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.VSTest.targetssrc/Platform/Microsoft.Testing.Platform.MSBuild/buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.propssrc/Platform/Microsoft.Testing.Platform.MSBuild/buildMultiTargeting/Microsoft.Testing.Platform.MSBuild.targetssrc/Platform/Microsoft.Testing.Platform.MSBuild/buildTransitive/Microsoft.Testing.Platform.MSBuild.propssrc/Platform/Microsoft.Testing.Platform.MSBuild/buildTransitive/Microsoft.Testing.Platform.MSBuild.targetssrc/Platform/Microsoft.Testing.Platform/build/Microsoft.Testing.Platform.propssrc/Platform/Microsoft.Testing.Platform/build/Microsoft.Testing.Platform.targetssrc/Platform/Microsoft.Testing.Platform/buildMultiTargeting/Microsoft.Testing.Platform.propssrc/Platform/Microsoft.Testing.Platform/buildMultiTargeting/Microsoft.Testing.Platform.targetssrc/Platform/Microsoft.Testing.Platform/buildTransitive/Microsoft.Testing.Platform.propssrc/Platform/Microsoft.Testing.Platform/buildTransitive/Microsoft.Testing.Platform.targetssrc/TestFramework/TestFramework.Extensions/build/net462/MSTest.TestFramework.targetssrc/TestFramework/TestFramework.Extensions/build/net8.0/MSTest.TestFramework.targetssrc/TestFramework/TestFramework.Extensions/build/net9.0/MSTest.TestFramework.targetssrc/TestFramework/TestFramework.Extensions/build/netstandard2.0/MSTest.TestFramework.targetssrc/TestFramework/TestFramework.Extensions/build/uap10.0/MSTest.TestFramework.targetssrc/TestFramework/TestFramework.Extensions/buildTransitive/net8.0AndLater/MSTest.TestFramework.targetssrc/TestFramework/TestFramework.Extensions/buildTransitive/others/MSTest.TestFramework.targetssrc/Package/MSTest.Sdk/Sdk/Features/Aspire.targetssrc/Package/MSTest.Sdk/Sdk/Features/Playwright.targetssrc/Package/MSTest.Sdk/Sdk/Runner/ClassicEngine.targetssrc/Package/MSTest.Sdk/Sdk/Runner/Common.targets(findings above)src/Package/MSTest.Sdk/Sdk/Runner/NativeAOT.targetssrc/Package/MSTest.Sdk/Sdk/VSTest/VSTest.targetsDirectory.Build.propsDirectory.Build.targetsDirectory.Packages.propseng/AfterSolutionBuild.targetseng/Analyzers.propseng/Build.propseng/Publishing.propseng/Tools.propseng/Versions.propseng/common/internal/Directory.Build.propseng/common/native/LocateNativeCompiler.targetssamples/public/Directory.Build.propssamples/public/Directory.Build.targetssamples/public/Directory.Packages.propssrc/Directory.Build.propssrc/Platform/Directory.Build.propstest/Directory.Build.propstest/IntegrationTests/TestAssets/Directory.Build.targetsReference
This review applies the rule catalog defined in
.github/agents/msbuild-reviewer.agent.md.Generated by the MSBuild Quality Review scheduled workflow.